Added Skiena's version of random pivot quicksort for reference
This commit is contained in:
parent
4076c96565
commit
28f33e93e6
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user