Быстрая сортировка (сортировка Хоара) - 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$
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д