Ну, похоже, вы сделали простую ошибку, понимая быструю сортировку.
Дело в том, что вы помещаете элемент pivot в правильную позицию внутри массива при вызове partition()
.
Что я имею в видусказать, рассматривать элементы изначально внутри массива как
[3, 4, 6, 7, 5, 8, 9, 2, 1, 4 ]
Теперьпосле вызова partition()
массив должен выглядеть следующим образом (учтите, что вы выбрали последний элемент в качестве основного элемента, отмеченного жирным шрифтом выше)
[3, 2, 1, 4 , 5, 8, 9, 4, 6, 7]
Теперь массив нужно разделить на три части
[3, 2, 1] [ 4 ][5, 8, 9, 4, 6, 7]
Мы знаем, что элемент шарнира находится в правильном положении, поэтому не нужно прикасаться к средней части, просто продолжайте работу с оставшейся левой и правой частью.
То, что вы сделали, считается только двумя частями после partition()
[3, 2, 1, 4 ] [5, 8, 9, 4, 6, 7]
Теперь для [3, 2, 1, 4 ], когда вы звоните quicksort()
, он падает в бесконечной рекурсии.
Я изменил часть ниже, надеюсь, это поможет
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);
}
}