Implemented quicksort with in-place sorting, rather than allocating
This commit is contained in:
parent
b55e35f83a
commit
4076c96565
@ -642,15 +642,55 @@ because apparently in real world benchmarks, it outperforms it 2-3x. This is
|
|||||||
likely due to the extra space requirements of mergesort. In particular if you
|
likely due to the extra space requirements of mergesort. In particular if you
|
||||||
have to allocate memory on the heap
|
have to allocate memory on the heap
|
||||||
|
|
||||||
#+begin_src C :includes stdio.h stdlib.h
|
#+begin_src C :includes stdio.h stdlib.h time.h
|
||||||
void quicksort(int *array, int len) {
|
void swap(int *i, int *j) {
|
||||||
int pivot = pivot();
|
int temp = *i;
|
||||||
int *left = quicksort(array, len / 2);
|
,*i = *j;
|
||||||
int *right =quicksort(array, len / 2);
|
,*j = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 pivot = array[start + r];
|
||||||
|
int mid = start;
|
||||||
|
int s = mid;
|
||||||
|
int h = end;
|
||||||
|
while (mid <= h) {
|
||||||
|
if (array[mid] < pivot) {
|
||||||
|
swap(&array[mid++], &array[s++]);
|
||||||
|
} else if (array[mid] > pivot) {
|
||||||
|
swap(&array[mid], &array[h--]);
|
||||||
|
} else {
|
||||||
|
mid++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
quicksort(array, start, s-1);
|
||||||
|
quicksort(array, s+1, end);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LEN 10
|
||||||
|
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");
|
||||||
|
|
||||||
|
quicksort(array, 0, LEN - 1);
|
||||||
|
|
||||||
|
for (int i = 0; i < LEN; i++) {
|
||||||
|
printf("%i", array[i]);
|
||||||
}
|
}
|
||||||
#+end_src
|
#+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
|
||||||
|
mid point, the iterator, and the high, then finish once mid passes h.
|
||||||
** 4.7 Distribution Sort: Bucketing
|
** 4.7 Distribution Sort: Bucketing
|
||||||
|
|
||||||
Two other sorting algorithms function similarly by subdividing the sorting
|
Two other sorting algorithms function similarly by subdividing the sorting
|
||||||
|
Loading…
x
Reference in New Issue
Block a user