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;
|
,*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) {
|
void quicksort(int *array, int start, int end) {
|
||||||
int len = end - start + 1;
|
int len = end - start + 1;
|
||||||
if (len <= 1) {
|
if (len <= 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int r = (int)((float)rand() / RAND_MAX * len);
|
int r = rand() % len;
|
||||||
int pivot = array[start + r];
|
int pivot = array[start + r];
|
||||||
int mid = start;
|
int mid = start;
|
||||||
int s = mid;
|
int s = mid;
|
||||||
@ -666,19 +681,24 @@ void quicksort(int *array, int start, int end) {
|
|||||||
swap(&array[mid], &array[h--]);
|
swap(&array[mid], &array[h--]);
|
||||||
} else {
|
} else {
|
||||||
mid++;
|
mid++;
|
||||||
|
quicksort(array, start, s-1);
|
||||||
|
quicksort(array, s+1, end);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
quicksort(array, start, s-1);
|
quicksort(array, start, s-1);
|
||||||
quicksort(array, s+1, end);
|
quicksort(array, s+1, end);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LEN 10
|
#define LEN 10
|
||||||
|
/* int array[LEN] = {5,4,3,2,1}; */
|
||||||
int array[LEN] = {5,4,3,2,3,2,1,1,8,6};
|
int array[LEN] = {5,4,3,2,3,2,1,1,8,6};
|
||||||
|
|
||||||
for (int i = 0; i < LEN; i++) {
|
for (int i = 0; i < LEN; i++) {
|
||||||
printf("%i", array[i]);
|
printf("%i", array[i]);
|
||||||
} printf("\n");
|
} printf("\n");
|
||||||
|
|
||||||
|
/* skiena_quicksort(array, 0, LEN - 1); */
|
||||||
quicksort(array, 0, LEN - 1);
|
quicksort(array, 0, LEN - 1);
|
||||||
|
|
||||||
for (int i = 0; i < LEN; i++) {
|
for (int i = 0; i < LEN; i++) {
|
||||||
@ -686,7 +706,6 @@ for (int i = 0; i < LEN; i++) {
|
|||||||
}
|
}
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
Usually in higher level languages like Python and Haskell, you would allocate
|
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
|
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
|
when doing it in place. This algorithm requires 3 pointers to keep track of the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user