Вы не меняете местами значения в функции partition
в двух строках:
A[i+1] = A[j];
A[i+1] = x
Вы должны поменять местами значения с помощью функции swap:
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
затем в ваш код:
swap(&A[i], &A[j]); // A[i] not A[i+1] as you did in your code.
swap(&A[i+1], &A[r]);
В функции quickSort
вы должны изменить на:
quickSort(A, p, q-1); // first half
quickSort(A, q + 1, r); // second half
Наконец, когда вы вызываете функцию quickSort
, это должно быть:
quickSort(arr, 0, 3);
Потому что, 4
находится вне массива.
Полный код:
#include <stdio.h>
void quickSort(int * A, int p, int r);
int partition(int * A, int p, int r);
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
void quickSort(int * A, int p, int r)
{
if(p < r)
{
int q = partition(A, p, r);
quickSort(A, p, q-1); // first half
quickSort(A, q + 1, r); // second half
}
}
int partition(int * A, int p, int r)
{
int x = A[r]; // x = key AKA pivot
int i = p - 1;
for(int j = p; j <= r-1; j++)
{
if(A[j] <= x)
{
i = i + 1;
swap(&A[i], &A[j]);
}
}
swap(&A[i+1], &A[r]);
return i + 1;
}
int main () {
int arr[4] = {10, 5, 7, 1};
quickSort(arr, 0, 3);
for(int i = 0; i < 4; i++) {
printf("%d\n", arr[i]);
}
}
Результат теста:
1
5
7
10