Помощь в написании студенческих работ
Антистрессовый сервис

Описание программы. 
Исследование методов сортировки выбором

РефератПомощь в написанииУзнать стоимостьмоей работы

Функция PrevState является вспомогательной функцией. Она изменяет текущее состояние с учетом того, что вершина последней кучи исключена из рассмотрения. For (i = array. Length / 2 — 1; i ≥ 0; i—) // элементы с номерами начиная с array. Length / 2 — 1 это листья, то тогда нужно переупорядочить поддеревья с корнями в индексах. Int posMaxTopElem = findPosMaxElem (mas, curState, i, ref… Читать ещё >

Описание программы. Исследование методов сортировки выбором (реферат, курсовая, диплом, контрольная)

Иерархия классов.

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;

Используемые элементы.

button.

richTextBox.

comboBox.

label.

Обработчики событий.

private void button1_Click (object sender, EventArgs e).

private void button2_Click (object sender, EventArgs e).

Функции В данной курсовой используется 3 основных и 4 вспомогательных функции.

Функция Print отвечает за вывод результата, предварительно отсортированного выбранным методом и передает результат в поле вывода.

private void Print (int[] array) // результат.

{.

richTextBox2.Clear (); // очищение поля.

foreach (var x in array) // перебор в переменную х всех значений массива array, в который записывается результат сортировки выбранным методом.

richTextBox2.Text += x + «» // добавление этих значений.

}.

Результат работы функции Print.

Рисунок.6 Результат работы функции Print.

Функция selectSort производит сортировку по алгоритму «Выборка» и передает отсортированный массив в функцию Print.

private void selectSort (int[] array) // сортировка выборкой.

{.

int min; // объявляем min.

for (int i = 0; i < array. Length; i++) // перебираем элементы.

{.

min = i; // присваиваем наименьший элемент i-ому.

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

if (array[j] < array[min]) // если элменент массива меньше минимального.

min = j; // присваиваем новое минимальное значение элементу массиву.

// swap-функция. Меняем местами значения.

int temp = array[i].

array[i] = array[min];

array[min] = temp;

}.

}.

Результат работы функции selectSort.

Рисунок.7 Результат работы функции selectSort.

Функция heapSort производит сортировку по алгоритму «Пирамида» и передает отсортированный массива в функцию Print.

private void heapSort (int[] array) // сортировка пирамидой.

{.

int i, temp; // объявляем переменные.

for (i = array. Length / 2 — 1; i >= 0; i—) // элементы с номерами начиная с array. Length / 2 — 1 это листья, то тогда нужно переупорядочить поддеревья с корнями в индексах.

downHeap (array, i, array. Length — 1); // вызывается функция downHeap и ей передаются аргументы.

for (i = array. Length — 1; i > 0; i—).

{.

temp = array[i];

array[i] = array[0];

array[0] = temp;

downHeap (array, 0, i — 1); // в функцию передаются аргументы с шагом — 1.

}.

}.

Результат работы функции heapSort.

Рисунок.8 Результат работы функции heapSort.

Функция smoothSort производит сортировку по алгоритму «Плавная» и передает отсортированный массив в функцию Print.

private void smoothSort (int[] mas) // функция плавная сортировки.

{.

make_heap_pool (mas); // вызов функции, создающей последовательность куч из произвольного массива.

for (int i = mas. Length — 1; i >= 0; i—).

{.

int nextPosHeapItemsAmount = 0;

int posMaxTopElem = findPosMaxElem (mas, curState, i, ref nextPosHeapItemsAmount); // максимальный верхний элемент кучи получает значение в виде результата функции findPosMaxElem.

if (posMaxTopElem ≠ i).

{.

swap (ref mas[i], ref mas[posMaxTopElem]); // вызываем функцию swap и передаем в нее значения mas[i] и mas[posMaxTopElem].

shiftDown (mas, nextPosHeapItemsAmount, posMaxTopElem); // вызываем функцию.

}.

PrevState (ref curState); // вызываем функцию PreveState и передаем значения, ссылаясь (ref) на значение переменной curState.

}.

}.

Результат работы функции smoothSort.

Рисунок.9 Результат работы функции smoothSort.

Функция downHeap является вспомогательной функцией для heapSort, обеспечивая нижнюю сортировку кучи массива.

private void downHeap (int[] array, int k, int n) // функция нижней сортировки.

{.

// объявляем переменные.

int new_elem;

int child;

new_elem = array[k];

while (k <= n / 2) // пока у array[k] есть дети выполняем.

{.

child = 2 * k;

// выбираем большего сына.

if (child < n && array[child] < array[child + 1]).

child++;

if (new_elem >= array[child]) break;

// иначе.

array[k] = array[child]; // переносим сына наверх.

k = child;

}.

array[k] = new_elem;

}.

Функция NextState является вспомогательной функцией. Делает обратную операцию, но при этом она еще возвращает номер бита, соответствующий вершине последней кучи, если та состоит более чем из одного элемента. В противном случае функция возвращает -1.

private int NextState (ref int curState) // Функция NextState, делает обратную операцию, но при этом она еще возвращает номер бита, соответствующий вершине последней кучи, если та состоит более чем из одного элемента. В противном случае функция возвращает -1.

{.

int posNewTop = -1; // позиция вершины объединенных куч.

// исключение.

if ((curState & 7) == 5).

{ // curState = 0101.

curState += 3; // curState = 1000.

posNewTop = 3;

}.

else // пытаемся найти два подряд единичных бита.

{.

int next = curState;

int pos = 0;

while (next ≠ 0 && (next & 3) ≠ 3).

{.

next >>= 1;

pos++.

}.

if ((next & 3) == 3) // curState = 1 100.

{.

curState += 1 << pos; // curState = 10 000.

posNewTop = pos + 2;

}.

else if ((curState & 1) ≠ 0) // curState = x001.

curState |= 2; // curState = x011.

else // curState = xx00.

curState |= 1; // curState = xx01.

}.

return posNewTop;

}.

Функция PrevState является вспомогательной функцией. Она изменяет текущее состояние с учетом того, что вершина последней кучи исключена из рассмотрения.

private void PrevState (ref int curState) //Функция PrevState изменяет текущее состояние с учетом того, что вершина последней кучи исключена из рассмотрения.

{.

if ((curState & 15) == 8).

{ // curState = 1000.

curState -= 3; // curState = 010.

}.

еlse if ((curState & 1) ≠ 0).

{.

if ((curState & 3) == 3) // curState = x011.

curState ^= 2; // curState = x001.

else // curState = xx01.

curState ^= 1; // curState = xx00.

}.

else // ищим первый единичный бит.

{.

int prev = curState;

int pos = 0;

while (prev ≠ 0 && !(Convert.ToBoolean (prev & 1))).

{.

prev >>= 1;

pos++;

}.

if (prev ≠ 0) // curState = xx10000.

{.

curState ^= 1 << pos;

curState |= 1 << (pos — 1);

curState |= 1 << (pos — 2); // curState = xx01100.

}.

else.

curState = 0;

}.

}.

Функция shiftDown является вспомогательной функцией. Она реализует просеивание данных массива «вниз».

private void shiftDown (int[] mas, int posHeapItemsAmount, int indexLastTop) // Реализация функции просейки вниз, в ней задается также mas[].

{.

int posCurNode = indexLastTop; //indexLastTop — индекс крайней вершин.

while (posHeapItemsAmount > 1) //nextPosHeapItemsAmount — количество элементво в кучи, вершина которой оказалось максимальной из всех вершин куч.

{.

// позиция правого сына.

int posR = posCurNode — 1;

// позиция левого сына.

int posL = posR — LeoNum[posHeapItemsAmount — 2]; // число элементов в текущей кучи.

int posMaxChild = posL;

int posNextTop = posHeapItemsAmount — 1;

if (mas[posR] > mas[posL]) // если позиция правого сына больше левого.

{.

posMaxChild = posR; // то «старший сын» правый.

posNextTop = posHeapItemsAmount — 2;

}.

if (mas[posCurNode] < mas[posMaxChild]).

{.

swap (ref mas[posCurNode], ref mas[posMaxChild]);

posHeapItemsAmount = posNextTop;

posCurNode = posMaxChild;

}.

else.

break;

}.

}.

Функция make_heap_pool является вспомогательной функцией. Она создает последовательности куч из произвольного массива.

private void make_heap_pool (int[] mas) // Функция создания последовательности куч из произвольного массива.

{.

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

{.

int posHeapItemsAmount = NextState (ref curState);

if (posHeapItemsAmount ≠ -1).

shiftDown (mas, posHeapItemsAmount, i);

}.

}.

Функция findPosMaxElem является вспомогательной функцией. Она ищет максимальный элемент среди вершин куч.

private int findPosMaxElem (int[] mas, int curState, int indexLastTop, ref int nextPosHeapItemsAmount) // Функция поиска максимального элемента среди вершин куч.

{.

int pos = 0;

// ищим позицию первого единичного бита.

while (!Convert.ToBoolean (curState & 1)).

{.

curState >>= 1;

pos++;

}.

int posMaxTopElem = indexLastTop;

nextPosHeapItemsAmount = pos;

int curTopElem = indexLastTop — LeoNum[pos];

curState >>= 1;

pos++;

while (curState ≠ 0).

{.

if ((curState & 1) ≠ 0).

{.

if (mas[curTopElem] > mas[posMaxTopElem]).

{.

posMaxTopElem = curTopElem;

nextPosHeapItemsAmount = pos;

}.

curTopElem -= LeoNum[pos];

}.

curState >>= 1;

pos++;

}.

return posMaxTopElem;

}.

Функция swap является вспомогательной функцией. Она выполняет переприсваивание значений.

private void swap (ref int a, ref int b) // функция переприсваивания (swap).

{.

int temp = b;

b = a;

a = temp;

}.

Руководство пользователя

  • 1. Для корректной работы программы необходимо заполнить вручную или сгенерировать с помощью кнопки массив данных.
  • 2. Чтобы автоматически заполнить массив данных нажмите кнопку «Сгенерировать»
  • 3. Необходимо в раскрывающемся списке выбрать подходящий вам метод сортировки.
  • 4. Для получения результата сортировки нажмите кнопку «Сортировать»
Показать весь текст
Заполнить форму текущей работой