Способы сортировок
Задача темы: изучить методику и получить навыки в разработке функциональности приложений, использующих сортировки текстовых данных.
Разработка: Приложение "Способы сортировки" для сортировки массива цифровых переменных.
Состав выполняемых функций:
- Файловые операции: нет
- Алгоритмы: пузырковая и Quick-сортировка
- Информационно-справочные:нет
Наращивание функциональности не предусматривается.
Защита данных предусматривается только от неквалифицированных действий пользователей.
В качестве входных данных используется набор переменных. Выходные данные программы – графическое отображение результатов в виде двух листбоксов в форме для SmartDevice.
Шаг 1. Разработка графического интерфейса
Используется только одна форма Form1 с одним текстовым полем, двумя листбоксами и тремя кнопками "Добавить", "Пузырек" и "Квик". Примерный дизайн приведен на рис.6.1.
Шаг 2. Добавление системных библиотек
using System; using System.Drawing; using System.Collections; using System.Windows.Forms; using System.Data; // добавляем библиотеку сомпонентов using System.ComponentModel;
Шаг 3. Добавляем массив переменных в состав public class Form1 : System.Windows.Forms.Form
int[] numbers = new int[16];
Шаг 4. Создаем процедуру ввода данных в листбоксы
Для кнопки "Добавить" пишем:
private void button1_Click(object sender, System.EventArgs e) { // Проверка - если в текстовом поле не цифра if (!char.IsDigit(textBox1.Text[0])) { textBox1.Text = "Введите цифру"; MessageBox.Show("Введите цифру!","Ошибка"); return; // влзврат в вызывающую программу} listBox1.Items.Add(textBox1.Text); // добавляем строку в листбокс 1 listBox2.Items.Add(textBox1.Text); // добавляем строку в листбокс 2 }
Шаг 5. Создаем процедуру пузырьковой сортировки
Для кнопки "Пузырек" пишем:
private void button2_Click(object sender, System.EventArgs e) { bool flipped = false; // определяем булеву переменную со значением false for(int i = listBox1.Items.Count - 1; i <= 0; i--) {// вложенный цикл for(int j = 0; j < i; j++) {/* преобразуем цифры в числа Int32 и задаем условие проверки значений по строкам */ if(Convert.ToInt32(listBox1.Items[j]) < Convert.ToInt32(listBox1.Items[j + 1]) ) { Object temp = listBox1.Items[j]; // определяем массив listBox1.Items[j] = listBox1.Items[j + 1]; listBox1.Items[j + 1] = temp; flipped = true; // переопределяем булеву переменную } } if(!flipped) return; } }
Шаг 6. Создаем функцию сортировки "Квик"
void QuickSort(ref int[] a, int lo0, int hi0) { int lo = lo0; int hi = hi0; if(lo <= hi) {return;} else if( lo = = hi - 1 ) {// если необходимо, меняем два соседних элемента местами if (a[lo] < a[hi]) { int T = a[lo]; a[lo] = a[hi]; a[hi] = T; } return; } int pivot = a[(lo + hi) / 2]; // меняем местами средний a[(lo + hi) / 2] = a[hi]; // и верхний элементы a[hi] = pivot; while( lo < hi ) { while (a[lo] <= pivot && lo < hi) // слева направо {// ищем элемент, lo++; // больший среднего } while (pivot <= a[hi] && lo < hi ) // справа налево {// ищем элемент, hi--; // меньший среднего } if( lo < hi ) // меняем найденные {// элементы местами int T = a[lo]; a[lo] = a[hi]; a[hi] = T; } } a[hi0] = a[hi]; // помещаем средний элемент в центр списка a[hi] = pivot; QuickSort(ref a, lo0, lo-1); // рекурсивно вызываем функцию QuickSort(ref a, hi+1, hi0); }
Шаг 7. Создаем процедуру вызова функции сортировки "Квик"
Для кнопки "Квик" пишем:
int[] intItems = new int[listBox2.Items.Count]; /* задаем массив из значений, выбираемых в листбоксе 3 и запускаем цикл перебора значений в массиве */ for(int i = 0; i < listBox2.Items.Count; i++) / intItems[i] = Convert.ToInt32(listBox2.Items[i]); // вызываем функцию сортировки QuickSort(ref intItems, 0, listBox2.Items.Count - 1); for(int i = 0; i < listBox2.Items.Count; i++) // переписываем массив в отсортировонном виде listBox2.Items[i] = intItems[i]; }