Быстрая сортировка на C#
Автор: Трубецкой Алексей
Пошаговое описание алгоритма
- Из массива выбирается элемент a[i]. Как правило, в качестве этого элемента берется центральный элемент массива.
- Остальные элементы распределяются таким образом, чтобы слева от a[i] оказались все элементы, меньшие или равные a[i]. Элементы, большие или равные a[i], помещаются справа. В результате массив будет выглядеть так:

- Производится проверка количества элементов в левой и правой частях массива. Если какая-либо часть (или обе части) содержит более двух элементов, то для этой части (или частей) запускается та же процедура сортировки с помощью рекурсивного вызова.
Реализация на C#
Класс QuickSorting, содержащий функцию быстрой сортировки, и класс Test для тестирования этой функции:
class QuickSorting {
public static void sorting(double[] arr, long first, long last) {
double p = arr[(last - first)/2 + first];
double temp;
long i = first, j = last;
while(i p && j >= first) --j;
if(i first) sorting(arr, first, j);
if(i key");
System.Console.ReadLine();
}
}
Смотрие также
Оставить комментарий
Комментарии
1.


7 апреля 2011, 15:43:03
Я уже молчу про строчку 4 (как пронумеровано выше). Ну зачем же делать перестановку, если i == j?
2.


7 апреля 2011, 15:29:43
А теперь попробуйте заполнить массив одинаковыми числами и посмотрите, что делает ваш цикл:
Строки 2 и 3 не выполняются (там строгое неравенство), поэтому всегда срабатывает перестановка. ВСЕГДА!!!
Обычная реализация этого алгоритма хуже всего работает на массивах, изначально переставленных в ОБРАТНОМ порядке. Вы придумали реализацию алгоритма, для которой существует еще одна неприятная вариация: она очень не любит одинаковые элементы.
В общем, КГ/АМ, уж извините.
Код:
while(i <= j) {
while(arr[ i ] < p && i <= last) ++i;
while(arr[ j ] > p && j >= first) --j;
if(i <= j) {
temp = arr[ i ];
arr[ i ] = arr[ j ];
arr[ j ] = temp;
++i; --j;
}
}
while(arr[ i ] < p && i <= last) ++i;
while(arr[ j ] > p && j >= first) --j;
if(i <= j) {
temp = arr[ i ];
arr[ i ] = arr[ j ];
arr[ j ] = temp;
++i; --j;
}
}
Строки 2 и 3 не выполняются (там строгое неравенство), поэтому всегда срабатывает перестановка. ВСЕГДА!!!
Обычная реализация этого алгоритма хуже всего работает на массивах, изначально переставленных в ОБРАТНОМ порядке. Вы придумали реализацию алгоритма, для которой существует еще одна неприятная вариация: она очень не любит одинаковые элементы.
В общем, КГ/АМ, уж извините.
