Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ТооП / Тооп(6)

.docx
Скачиваний:
17
Добавлен:
31.05.2018
Размер:
490.39 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«КАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

НАБЕРЕЖНОЧЕЛНИНСКИЙ ИНСТИТУТ (ФИЛИАЛ)

КАФЕДРА ИНФОРМАЦИОННЫХ СИСТЕМ

ЛАБОРАТОРНАЯ РАБОТА №6

«Сортировка массивов»

По дисциплине

«Объектно-ориентированное программирование»

Выполнил:

Студент группы 2161121

Золотых С.В.

Проверил:

Илюхин А.Н.

Набережные Челны

2017

Цель работы

Ознакомиться с различными методами сортировки массивов.

Постановка задачи

Создать объекты класса <имя класса> (класс и его поля задаются в соответствии с выбранным вариантом в лабораторной работе 1), причем объекты класса должны хранить данные о предметной области, связанные со свойствами предмета задания по варианту. В класс контейнерного типа, полученный в лабораторной работе 4, добавить все рассмотренные сортировки в качестве методов. Осуществите сортировку своих данных по разным полям и сравните эффективность методов сортировки.

№ варианта

Имя класса

Поле 1

Поле 2

Поле 3

3

Процессор

Фирма производитель

Количество ядер

Тактовая частота

Текст программы

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.Diagnostics;

using System.Threading;

namespace ТООП_6

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

dataGridView1.RowCount = 10000;

dataGridView1.ColumnCount = 5;

}

private void button1_Click(object sender, EventArgs e)

{

int n = 10000;//заполнение массива случайными числами

Random r = new Random();

int[] mas = new int[n];

int[] copy_1 = new int[n];

int[] copy_2 = new int[n];

int[] copy_3 = new int[n];

int[] copy_4 = new int[n];

int[] copy_5 = new int[n];

dataGridView2.RowCount = n;

for (int i = 0; i < n; i++)

{

mas[i] = r.Next(-10000, 20000);

dataGridView2.Rows[i].Cells[0].Value = mas[i];

copy_1[i] = mas[i];

copy_2[i] = mas[i];

copy_3[i] = mas[i];

copy_4[i] = mas[i];

copy_5[i] = mas[i];

}

//вызов методов сортировки

Bubble(copy_1);

Choice(copy_2);

Shaker(copy_3);

Shell(copy_4);

Incl(copy_5);

}

public void Bubble(int[] b)//Метод сортировки пузырьком

{

int counter_1 = 0, S;//S-переменная, отвечающая за продолжение или выход из цикла

Stopwatch stop = new Stopwatch();//счётчик для определения времени всей сортировки

stop.Start();

for (int i = 0; i < b.Length; i++)

{

S = 0;

for (int j = 0; j < b.Length - i - 1; j++)

{

counter_1++;

if (b[j] > b[j + 1])

{

S = 1;

int temp = b[j];

b[j] = b[j + 1];

b[j + 1] = temp;

counter_1++;

}

}

if (S==1) { continue; }

else { break; }

}

stop.Stop();

string Time = Convert.ToString(stop.ElapsedMilliseconds);

for (int i = 0; i < b.Length; i++)

{

dataGridView1.Rows[i].Cells[0].Value = b[i];

}

label2.Text = "Кол-во итераций (пузырьковый метод) = " + counter_1;

label6.Text = "Метод выполнения сортировки пузырьком " + Time;

counter_1 = 0;

}

public void Choice(int[] k)//метод прямого выбора

{

int counter_2 = 0;

Stopwatch stop = new Stopwatch();

stop.Start();

int min, t;

int l = k.Length;

for (int i = 0; i < l - 1; i++)

{

min = i;

for (int j = i + 1; j < l; j++)//просматриваем от последующего

{

counter_2++;

if (k[j] < k[min])

{

min = j;

}

}

if (min != i)

{

t = k[i];

k[i] = k[min];

k[min] = t;

counter_2++;

}

}

stop.Stop();

string Time = Convert.ToString(stop.ElapsedMilliseconds);

for (int i = 0; i < l; i++)//вывод массива

{

dataGridView1.Rows[i].Cells[1].Value = k[i];

}

label1.Text = "Кол-во итераций (метод прямого выбора) = " + counter_2;

label7.Text = "Метод сортировки прямого выбора " + Time;

counter_2 = 0;

}

public void Shaker(int[] k)//шейкерный метод

{

int counter_3 = 0;

Stopwatch stop = new Stopwatch();

stop.Start();

int t = 0, left = 0;

int right = k.Length - 1;

while (left < right)

{

for (int i = left; i < right; i++)//просматриваем слева

{

counter_3++;

if (k[i] > k[i + 1])

{

t = k[i];

k[i] = k[i + 1];

k[i + 1] = t;

t = i;

counter_3++;

}

}

right = t;

if (left >= right) break;

for (int i = right; i > left; i--)//просматриваем справа

{

counter_3++;

if (k[i - 1] > k[i])

{

t = k[i];

k[i] = k[i - 1];

k[i - 1] = t;

t = i;

counter_3++;

}

}

left = t;

}

stop.Stop();

string Time = Convert.ToString(stop.ElapsedMilliseconds);

for (int i = 0; i < k.Length; i++)//вывод данных

{

dataGridView1.Rows[i].Cells[2].Value = k[i];

}

label3.Text = "Кол-во итераций (шейкерный метод) = " + counter_3;

label8.Text = "Метод выполнения шейкерной сортировки " + Time;

counter_3 = 0;

}

public void Shell(int[] k)//метод Шелла

{

Stopwatch stop = new Stopwatch();

stop.Start();

int counter_4 = 0, t;

int step = k.Length / 2;//шаг для разбиения массива

while (step > 0)

{

for (int i = 0; i < (k.Length - step); i++)

{

t = i;

counter_4++;

while ((t >= 0) && (k[t] > k[t + step]))

{

int tmp = k[t];

k[t] = k[t + step];

k[t + step] = tmp;

t -= step;

counter_4++;

}

}

step = step / 2;//уменьшаем шаг в два раза

}

stop.Stop();

string Time = Convert.ToString(stop.ElapsedMilliseconds);

for (int i = 0; i < k.Length; i++)

{

dataGridView1.Rows[i].Cells[3].Value = k[i];

}

label4.Text = "Кол-во итераций (метод Шелла) = " + counter_4;

label9.Text = "Метод выполнения сортировки Шелла " + Time;

counter_4 = 0;

}

public void Incl(int[] k)//метод прямого включения

{

int counter_5 = 0;

Stopwatch stop = new Stopwatch();

stop.Start();

for (int i = 1; i < k.Length; i++)

{

counter_5++;

int value = k[i]; // запоминаем значение элемента

int index = i; // и его индекс

while ((index > 0) && (k[index - 1] > value))

{

k[index] = k[index - 1];//смещаем другие элементы к концу массива пока они меньше index

index--;// смещаем просмотр к началу массива

counter_5++;

}

k[index] = value; // рассматриваемый элемент помещаем на освободившееся место

}

stop.Stop();

string Time = Convert.ToString(stop.ElapsedMilliseconds);

for (int i = 0; i < k.Length; i++)

{

dataGridView1.Rows[i].Cells[4].Value = k[i];

}

label5.Text = "Кол-во итераций (метод прямого включения) = " + counter_5;

label10.Text = "Метод прямого включения " + Time;

counter_5 = 0;

}

private void button2_Click(object sender, EventArgs e)

{

Application.Exit();

}

}

}

Результат работы программы

Блок-схема

о

о

о

о

о

о

Вывод

Была создана программа, реализующая сортировку поля массива данных. Для примера было выбрано поле k, а для показания правильности сортировки вводились случайные числа. Также была создана отдельная таблица DataGridView для результата сортировок. Всего было реализовано пять методов сортировки. Они объявлялись как отдельные методы. Эффективность методов сортировки реализована подсчётом количества итераций и времени (миллисекунды).

Было произведено 10 экспериментов с различным количеством данных. В результате выполнения программы было установлено, что метод Шелла и метод прямого выбора являются наиболее эффективным. Метод Шелла реализовывается за наименьший интервал времени со средним, относительно других методов, количеством итераций. Пузырьковый метод и метод прямого включения, на мой взгляд, могут лучше подойти для массивов с большим количеством данных.

Лабораторная работа помогла на практике реализовать разные методы сортировок массивов данных.

Соседние файлы в папке ТооП