Российская международная академия туризма
Опубликован: 09.09.2008 | Доступ: свободный | Студентов: 811 / 38 | Оценка: 4.33 / 4.33 | Длительность: 13:07:00
Лекция 7:

Способы сортировок

< Лекция 6 || Лекция 7 || Лекция 8 >
Аннотация: В лекции разобран пример реализации сортировки методом "пузырька" и быстрой сортировки для текстовых строк, состоящих из цифр

Задача темы: изучить методику и получить навыки в разработке функциональности приложений, использующих сортировки текстовых данных.

Разработка: Приложение "Способы сортировки" для сортировки массива цифровых переменных.

Состав выполняемых функций:

  • Файловые операции: нет
  • Алгоритмы: пузырковая и Quick-сортировка
  • Информационно-справочные:нет

Наращивание функциональности не предусматривается.

Защита данных предусматривается только от неквалифицированных действий пользователей.

В качестве входных данных используется набор переменных. Выходные данные программы – графическое отображение результатов в виде двух листбоксов в форме для SmartDevice.

Шаг 1. Разработка графического интерфейса

Используется только одна форма Form1 с одним текстовым полем, двумя листбоксами и тремя кнопками "Добавить", "Пузырек" и "Квик". Примерный дизайн приведен на рис.6.1.


Рис. 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]; 
}
< Лекция 6 || Лекция 7 || Лекция 8 >