Я просто попытался реализовать алгоритм быстрой сортировки из википедии (https://en.wikipedia.org/wiki/Quicksort), но чего-то не хватает. Вот мой код:Quicksort: wikipedia-реализация не работает
public static void quicksort(int[] a, int lo, int hi) {
if(lo < hi) {
int p = partition(a, lo, hi);
quicksort(a, lo, p - 1);
quicksort(a, p + 1, hi);
}
}
public static int partition(int[] a, int lo, int hi) {
//choose pivot element
int pivotIndex = 0;
int pivotVal = a[pivotIndex];
//put pivot at the end of array
swap(a, pivotIndex, hi);
//compare other elements to pivot and swap accordingly
int storeindex = lo;
for(int i = lo; i < hi; i++) {
if(a[i] <= pivotVal) {
swap(a, i, storeindex);
storeindex++;
}
//set pivot in right place of array
swap(a, storeindex, hi);
}
return storeindex; //return
}
public static void swap(int[] a, int place1, int place2) {
int temp = a[place1];
a[place1] = a[place2];
a[place2] = temp;
}
А вот пример того, что происходит не так:
int[] a = {1,2,3,4,5};
quicksort(a, 0, a.length - 1);
возвращается: 1, 2, 3, 5, 4
вместо того, что он должен: 1, 2, 3, 4, 5
Я смотрел на это довольно долгое время, и я был бы очень признателен, если бы кто-то помог мне выяснить, где я ошибся :) Спасибо!
Perfect - это работало! Спасибо –
Выбор стержня на самом деле [интересный вопрос] (http://stackoverflow.com/questions/164163/quicksort-choosing-the-pivot) сам по себе. Всегда использовать первый или последний элемент раздела, поскольку pivot будет означать худшую производительность при сортировке/сортировке массивов (например, данные, которые вы используете). –