Ваш код имеет несколько проблем.
Во-первых, ваша функция подкачки меняет местные переменные a
и b
, но это не повлияет на массив a
в partition
. Йен Эбботт объяснил это более подробно.
Один из способов решить эту проблему - передать адреса элементов массива через указатели, чтобы swap
мог получить к ним доступ и изменить их. Более простой способ - написать функцию подкачки, которая работает с индексами массива:
void swap(int array[], int i, int j)
{
int t = array[i]; array[i] = array[j]; array[j] = t;
}
Во-вторых, должна когда-нибудь остановить рекурсию. Когда у вас есть массив только с одним элементом или вообще без элементов, делать нечего, потому что массив (или подмассив) уже отсортирован.
Так что ничего не делайте в этом случае. Или, скорее, делать что-то только тогда, когда у вас есть хотя бы два элемента. Это имеет приятный побочный эффект, что рекузрион фактически останавливается. :)
void quicksort(int a[], int l, int h)
{
if (l < h) {
int j;
j = partition(a, l, h);
quicksort(a, l, j - 1);
quicksort(a, j + 1, h);
}
}