Выполнить: Разработать приложение, которое сортирует предложенный массив целых чисел из некоторого интервала по возрастанию.
Пример выполнения: Форма «Сортировка массива» [Название проекта: Lesson_14Lab1, название файла L14Lab1.cs]
✍ Выполнение:
Рассмотрим задачу упорядочивания массива в простейшей постановке: дан числовой массив х1, …, хn, элементы которого попарно различны, требуется переставить элементы массива так, чтобы после перестановки они были упорядочены в порядке возрастания: х1< … < хn. Опишем алгоритм решения этой задачи.
Используем алгоритм сортировки выбором. Суть его такова: очевидно, что первое место в массиве должен занять наименьший элемент, второе – наименьший из всех остальных элементов и т.д. Пусть x1, …, xi-1 уже получили нужные значения. Тогда определение индекса k наименьшего из xi, xi+1, … xn и перестановка xi c xk приведут к тому, что x1, …, xi будут иметь нужные значения. Составим программу для этого алгоритма.
Создайте новый проект и разместите элементы управления (txtN, txtMin, txtMax, lblArr, lblResult, btnNewArr, btnSort и btnExit) на форме так, как показано на рисунке (рисунок). Используйте элемент GroupBox для группировки.
Установите значение для свойства Enabled кнопки btnSort равным False (т.о., заблокировав кнопку).
Самостоятельно запрограммируйте кнопку Выход.
Заблокируйте текстовое поле btnN, т.к. мы будем использовать 10 элементов массива (свойство Enabled = false).
В разделе описаний объявите массив из 10 элементов следующим образом:
privateint[] Arr =newint[10];
private int[] Arr = new int[10];
Теперь необходимо инициализировать наш массив целыми числами из некоторого промежутка. Процедура обработки события Click для кнопки btnNewArr выглядит следующим образом:
privatevoid btnNewArr_Click(object sender, EventArgs e){int n =10;int a =int.Parse(txtMin.Text);int b =int.Parse(txtMax.Text);
Random r =new Random();for(int i =0; i < n; i++){
Arr[i]= r.Next(a, b);
lblArr.Text+= Arr[i];if(i!=n) lblArr.Text+=", ";}
btnSort.Enabled=true;}
private void btnNewArr_Click(object sender, EventArgs e)
{
int n = 10;
int a = int.Parse(txtMin.Text);
int b = int.Parse(txtMax.Text);
Random r = new Random();
for(int i = 0; i < n; i++)
{
Arr[i] = r.Next(a, b);
lblArr.Text += Arr[i];
if (i!=n) lblArr.Text += ", ";
}
btnSort.Enabled = true;
}
Наконец, реализуем описанный выше алгоритм сортировки в процедуре обработки события Click для кнопки btnSort. Предварительно опишем функцию MinNumber, которая осуществляет поиск позиции минимального элемента массива:
privateint MinNumber(int[] x, int m){int min = x[m];int MinN = m;for(int i = m; i<x.Length; i++){if(x[i]<min){
min = x[i];
MinN = i;}}return MinN;}
private int MinNumber(int [] x, int m)
{
int min = x[m];
int MinN = m;
for (int i = m; i<x.Length; i++){
if (x[i] <min){
min = x[i];
MinN = i;
}
}
return MinN;
}
Теперь опишем главный фрагмент кода, который вызывает функцию поиска позиции минимума, начиная с нулевой позиции массива; затем, после выполнения функции, на нулевое место становится минимальный элемент, а функция вызывается с аргументом уже первой (а не нулевой) позиции (затем второй позиции и т.д.):
privatevoid btnSort_Click(object sender, EventArgs e){int k, t;for(int i=0; i < Arr.Length; i++){
k = MinNumber(Arr, i);
t = Arr[i];
Arr[i]= Arr[k];
Arr[k]= t;
lblResult.Text+= Arr[i];if(i != Arr.Length-1){ lblResult.Text+=", ";}}
btnSort.Enabled=false;}
private void btnSort_Click(object sender, EventArgs e)
{
int k, t;
for(int i=0; i < Arr.Length; i++)
{
k = MinNumber(Arr, i);
t = Arr[i];
Arr[i] = Arr[k];
Arr[k] = t;
lblResult.Text += Arr[i];
if (i != Arr.Length - 1) { lblResult.Text += ", "; }
}
btnSort.Enabled = false;
}
Запустите и отладьте приложение. Вы, очевидно, заметили, что программа начинает некорректно работать при повторном нажатии на кнопку Новый массив. Для того чтобы выправить эти дефекты, создадим процедуру для очистки окон ClearFiealds:
Вызовем созданную подпрограмму в начале процедуры обработки события Click для кнопки btnNewArr, а также в процедурах обработки события Change для текстовых окон txtMin и txtMax следующим образом:
ClearFields();
ClearFields();
Запустите и отладьте приложение.
Дополнительное задание:
Самостоятельно разработать программу для реализации алгоритма сортировки вставками. Суть этого алгоритма в следующем: просматриваются последовательно элементы массива х2, …, хn и каждый новый элемент xi вставляется на подходящее место в уже упорядоченную совокупность x1, …, xi-1. Это место определяется последовательным сравнением xiс упорядоченными элементами x1, …, xi-1. При решении этой задачи необходимо описать и использовать функцию Insertion, которая вставляет xiна подходящее место в уже упорядоченную последовательность x1, …, xi-1.
Вопросы для самоконтроля:
Какие алгоритмы сортировок Вы знаете? Опишите один их них.
Как передать массив в процедуру в качестве параметра?
* При использовании материалов обязательна ссылка на источник: Майер С.Ф., «Языки программирования (C#) / Programming languages (C#)» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2020. – 212 с.
Все права защищены. Использование любых материалов сайта возможно только с разрешения правообладателя. По вопросам размещения рекламы на сайте - обращайтесь: mayersvetlana @ yandex.ru