Быстрая сортировка (сортировка Хоара) - C#
Формулировка задачи:
Помогите, пожалуйста, мучаюсь второй день с быстрой сортировкой...
И сразу показываю недоработанный код:
После выполнения сего кода, получится массив, разбитый на 2 подмассива и "среднее" число(pivot) - слева от него будут меньшие элементы(не отсортированные между собой), а справа большие (так же не отсортированы).
Собственно вот и вопрос, как дальше продолжить в таком же стиле отсортировывать уже те два ПОДмассива(стоящие слева и справа от среднего числа)?
Прочитал комментарий ниже, который помог мне понять дальнейшие действия, если правильно понял, то мне осталось с помощью РЕКУРСИИ "досортировать" массив и вуаля
int[] array = { 3, 0, 1, 8, 7, 2, 5, 4, 9, 6 }; // подопытный массив =)
int save = 0; //переменная с помощью которой мы меняем местами елементы массива
int r = array.Length - 1; //переменная - длина массива (счет с 0)
Console.WriteLine("Исходный массив:");
for (int i = 0; i <= r; i++)
{
Console.Write("{0}, ",array[i]);
}
// БЫСТРАЯ СОРТИРОВКА (СОРТИРОВКА ХОАРА)
//опрным элементом(pivot) сделаем первый элемента массива
for (int i = 0; ; ) //"бесконечный" цикл. Выход сделан с помощью break;
{
//сравниваем элементы массива
if (array[i] >= array[r])
{
//меняем местами
save = array[i];
array[i] = array[r];
array[r] = save;
//--------------
i++;
for (; ; i++)//"бесконечный" цикл. Выход сделан с помощью break;
{
//сравниваем элементы массива
if (array[i] > array[r])
{
//меняем местами
save = array[i];
array[i] = array[r];
array[r] = save;
//--------------
r--;
break; //выходим из внутреннего цикла
}
}
}
else { r--; }
//если элементы "встретились", тогда выходим
if (array[i] == array[r])
{
break;
}
}
//вывод отсортированного на "половину" массива
Console.WriteLine("\n\nОтсортированный на "половину" массив:");
for (int i = 0; i < array.Length; i++)
{
Console.Write("{0}, ", array[i]);
}
//задержка консоли
Console.ReadKey();
Упростим алгоритм. Выбираем опорным первый (потом легко переделать на медиану).
Массив:
3 7 1 5 9
, переставляем все что меньше опорного слева, а те что больше или равны - справа:
1 3 7 5 9
, массив разбился на два массива - слева от опорного и справа от него. Применяем этот же алгоритм к каждому из них и всё, получилась рекурсия, т.е. теперь мы работаем с массивами: 1-й состоящий только из 1, а 2-й: 7 5 9.
Если что, делал первую сортировку(до разделения) с помощью видео на YouTube и статьи в Wikiпро быструю сортировку. Чтобы лучше понять смысл, дополнительно брал еще материал с поиска Яндекс и этих двух видео с Ютуба:
https://www.youtube.com/watch?v=kq_EM_7Wdt8
https://www.youtube.com/watch?v=Xgaj...QGS1&index=134
Решение задачи: «Быстрая сортировка (сортировка Хоара)»
textual
Листинг программы
andrew@debppc:~/workspace/c_diez/numbers$ gmcs QuickSort.cs andrew@debppc:~/workspace/c_diez/numbers$ ./QuickSort.exe Unsorted 3 9 4 6 4 1 2 3 2 8 7 7 Sorted 1 2 2 3 3 4 4 6 7 7 8 9 andrew@debppc:~/workspace/c_diez/numbers$