Added Skiena's version of random pivot quicksort for reference

This commit is contained in:
Joseph Ferano 2023-01-16 21:06:37 +07:00
parent 4076c96565
commit 28f33e93e6

View File

@ -649,12 +649,27 @@ void swap(int *i, int *j) {
,*j = temp;
}
void skiena_quicksort(int A[], int p, int q) {
if(p >= q) return;
swap(&A[p + (rand() % (q - p + 1))], &A[q]); // PIVOT = A[q]
int i = p - 1;
for(int j = p; j <= q; j++) {
if(A[j] <= A[q]) {
swap(&A[++i], &A[j]);
}
}
skiena_quicksort(A, p, i - 1);
skiena_quicksort(A, i + 1, q);
}
void quicksort(int *array, int start, int end) {
int len = end - start + 1;
if (len <= 1) {
return;
}
int r = (int)((float)rand() / RAND_MAX * len);
int r = rand() % len;
int pivot = array[start + r];
int mid = start;
int s = mid;
@ -666,19 +681,24 @@ void quicksort(int *array, int start, int end) {
swap(&array[mid], &array[h--]);
} else {
mid++;
quicksort(array, start, s-1);
quicksort(array, s+1, end);
return;
}
}
quicksort(array, start, s-1);
quicksort(array, s+1, end);
return;
}
#define LEN 10
/* int array[LEN] = {5,4,3,2,1}; */
int array[LEN] = {5,4,3,2,3,2,1,1,8,6};
for (int i = 0; i < LEN; i++) {
printf("%i", array[i]);
} printf("\n");
/* skiena_quicksort(array, 0, LEN - 1); */
quicksort(array, 0, LEN - 1);
for (int i = 0; i < LEN; i++) {
@ -686,7 +706,6 @@ for (int i = 0; i < LEN; i++) {
}
#+end_src
Usually in higher level languages like Python and Haskell, you would allocate
new arrays to hold the new sorted elements. However, it becomes more challenging
when doing it in place. This algorithm requires 3 pointers to keep track of the