
Министерство образования и науки Украины
Национальный аэрокосмический университет
Им. Н.Е. Жуковского Кафедра компьютерных систем и сетей
Лабораторная работа № 1
«Исследование простых алгоритмов сортировки»
по курсу «Модели и структуры данных»
ХАІ.503.525I.14O.050102, 1205165 ПЗ
|
Выполнила: |
студент гр. 525и |
КриворучкоН.В |
|
|
подпись |
Дата |
|
Проверил: |
Ассистент каф 503 |
Худолей М.С |
|
|
подпись |
дата |
Харьков 2014
1. Задание:
Разработать проект для исследования алгоритмов сортировки в соответствии с вариантом (сортировка простыми включениями (простой вставкой),шейкер-сортировка). Интервал: [0,200].
Разработать интерфейс проекта, позволяющий:
задавать размерность и качество массива;
осуществлять выбор алгоритма сортировки для исследования;
осуществлять вывод информации о результатах исследования алгоритма сортировки (исходный и отсортированный массив, пошаговую работу алгоритма сортировки (при небольшой размерности массива), показатели качества работы алгоритма сортировки).
Создать подпрограмму для генерации целочисленного массива различного качества. В подпрограмме предусмотреть:
задание размерности массива;
задание диапазона чисел массива;
создание массива с равномерно распределенными случайными числами;
создание упорядоченного по возрастанию массива;
создание упорядоченного по убыванию массива.
Создать подпрограмму, реализующую алгоритм сортировки в соответствии с вариантом. В подпрограмме предусмотреть:
определение числа сравнений;
определение числа обменов;
определение суммы обменов и сравнений;
сортировку массива по возрастанию.
2.Математическая постановка задачи:
Задача сортировки состоит в следующем: пусть дана последовательность из n элементов принадлежащих некоторому множеству а, на котором задано отношение всеобщего порядка “<=”. Найти перестановку этих элементов в таком порядке ak1,…akn, при котором будет справедливо отношение ak1<=ak2<=…akn.
3.Текст программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Lab1_MSD
{
public partial class Form1 : Form
{
List<int> array = new List<int>();
public Form1()
{
InitializeComponent();
cmbGenerate.SelectedIndex = 0;
cmbType.SelectedIndex = 0;
}
private void button1_Click(object sender, EventArgs e)
{
Random rnd = new Random();
int count = (int)numCount.Value;
array = new List<int>();
for (int i = 0; i < count; i++)
{
array.Add(rnd.Next((int)numMin.Value, (int)numMax.Value));
}
if (cmbGenerate.SelectedIndex == 1)
{
array.Sort();
}
else if (cmbGenerate.SelectedIndex == 2)
{
array.Sort();
array.Reverse();
}
ShowArray(txtGenerate);
btnSort.Enabled = true;
txtView.Text = "";
}
void ShowArray(TextBox textbox)
{
textbox.Text = "";
foreach (int item in array)
{
textbox.Text += item + " ";
}
}
private void button1_Click_1(object sender, EventArgs e)
{
txtSteps.Text = "";
if (cmbType.SelectedIndex == 0) //выбрана сортировка простыми включениями
{
int tmp; //temp variable
int comparisons = 0; // количество сравнений
int exchanges = 0; // количество обменов
for (int i = 1; i < (int)numCount.Value; ++i)
{
tmp = array[i];
for (int j = i - 1; (j >= 0); --j)
{
comparisons++;
if (array[j] > tmp)// сравнение
{
exchanges++; // обмен
array[j + 1] = array[j];
array[j] = tmp;
}
else
break;
foreach (int item in array)
{
txtView.Text += item + " ";
}
txtView.Text += "\n";
}
}
ShowArray(txtSort);
txtSteps.Text += "Сравнений: " + comparisons.ToString() + Environment.NewLine;
txtSteps.Text += "Обменов: " + exchanges.ToString() + Environment.NewLine;
txtSteps.Text += "Операций: " + (comparisons + exchanges).ToString();
}
else if (cmbType.SelectedIndex == 1) //выбрана шейкер-сортировка
{
int i, left, right, a, tmp, comparisons = 0, exchanges = 0;
for (right = (int)numCount.Value - 1, left = 0, a = -1; a != 0; )//определяем правую и левую границу
{
a = 0;
for (i = left; i < right; i++)//слева направо
{
comparisons++;
if (array[i] > array[i + 1]) //сравнения
{
exchanges++; //обмен
tmp = array[i];
array[i] = array[i + 1];
array[i + 1] = tmp;
a = i;
}
}
right = a;
for (i = right; i > left; i--)//справа налево
{
comparisons++;
if (array[i - 1] > array[i]) //сравнения
{
exchanges++; //обмен
tmp = array[i];
array[i] = array[i - 1];
array[i - 1] = tmp;
a = i;
}
}
left = a;
foreach (int item in array)
{
txtView.Text += item + " ";
}
txtView.Text += "\n";
}
ShowArray(txtSort);
txtSteps.Text += "Сравнений: " + comparisons.ToString() + Environment.NewLine;
txtSteps.Text += "Обменов: " + exchanges.ToString() + Environment.NewLine;
txtSteps.Text += "Операций: " + (comparisons + exchanges).ToString();
}
}
}
}