diff --git a/TheAlgorithmDesignManual.org b/TheAlgorithmDesignManual.org index 6e208ca..3c1fcc4 100644 --- a/TheAlgorithmDesignManual.org +++ b/TheAlgorithmDesignManual.org @@ -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