На этом шаге мы рассмотрим алгоритм сортировки массива.
Следующий пример имеет отношение к сортировке массивов. Для этого используем метод пузырька. Метод пузырька может применяться к массиву из элементов, для которых имеют смысл операции сравнения. Сортировка массива выполняется следующим образом. Последовательно перебираются все элементы массива. Сравниваются пары соседних элементов. Если значение элемента слева больше значения элемента справа, то эти элементы обмениваются значениями. В противном случае ничего не происходит. После одного полного перебора элементов самое большое значение гарантированно будет у последнего элемента. Чтобы второе но величине значение было у предпоследнего элемента, необходимо еще раз перебрать элементы массива (и выполнить для них попарное сравнение). При этом последний элемент уже можно не проверять. Чтобы переместить на "правильную" позицию третье по величине значение, еще раз перебираются элементы массива (теперь можно не проверять два последних элемента). Процесс продолжается до тех пор, пока значения элементов не будут отсортированы в возрастающем порядке. Итак, один полный перебор элементов гарантирует перестановку в "правильную" позицию одного значения. Количество полных переборов на единицу меньше количества элементов в массиве, поскольку, когда второй элемент имеет "правильное" значение, то автоматически у первого элемента оно тоже "правильное". При первом переборе проверяются все элементы массива. За каждый следующий перебор проверяется на одни элемент меньше, чем это было для предыдущего раза.
Теперь рассмотрим текст программы. Там методом пузырька сортируется символьный массив.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr54_1 { class Program { static void Main() { // Символьная переменная: char s; // Исходный символьный массив: char[] symbs = {'Q', 'Ы', 'a', 'B', 'R', 'A', 'r', 'q', 'b'}; // Отображение содержимого массива: Console.WriteLine("Массив до сортировки:"); for (int k = 0; k < symbs.Length; k++){ Console.Write(symbs[k] + " "); } Console.WriteLine(); // Сортировка элементов в массиве: for (int i = 1; i < symbs.Length; i++){ // Перебор элементов: for (int j = 0; j < symbs.Length-i; j++){ // Если значение элемента слева больше // значения элемента справа: if ( symbs[j] > symbs[j + 1] ) { s = symbs[j+1]; symbs[j+1] = symbs[j]; symbs[j] = s; } } } // Отображение содержимого массива: Console.WriteLine("Массив после сортировки:"); for (int k=0; k < symbs.Length; k++){ Console.Write(symbs[k] + " "); } Console.WriteLine(); // Задержка: Console.ReadLine(); } } }
Как выглядит результат выполнения программы, показано ниже.
Рис.1. Результат выполнения приложения
Массив, предназначенный для сортировки, создается в программе командой
char[] symbs = {'Q', 'Ы', 'a', 'B', 'R', 'A', 'r', 'q', 'b'}; .
В теле внутреннего цикла размещена условная конструкция. Здесь проверяется условие symbs[ j ]>symbs [ j+1]. Оно истинное, если элемент слева больше элемента справа. Если так, то сначала командой
s = symbs[j+1];
symbs[j+1] = symbs[j];
symbs[j] = s;
Важный момент связан с процедурой сравнения значений элементов массива в условной конструкции. Пикантность ситуации в том, что сравнивают символьные значения. В таком случае выполняется сравнение кодов символов. Поэтому сортировка символьного массива в порядке возрастания означает, что значения будут упорядочены от символов с наименьшим значением кода до символов с наибольшим значением кода.
После того как сортировка массива закончена, с помощью конструкции цикла в консольном окне отображаются значения элементов уже отсортированного массива.
На следующем шаге мы рассмотрим цикл по массиву.