void quicksort(int * arr, int begin, int end) { if (end - begin < 50) { insertionSort(arr, begin, end); return; } int pivot = selectPivot(arr, begin, end-1); int l = begin; int u = end - 2; while (1) { while (arr[++l] < pivot); while (arr[--u] > pivot); if (l < u) swap(arr[l], arr[u]); else break; } swap(arr[l], arr[end - 1]); quicksort(arr, begin, l); quicksort(arr, l, end); }
unsigned int findMinimumKSmartPivot(unsigned long* data, int length, unsigned int k) { int pos = 0; unsigned long * array = data; int len = length; int count = 0; while(1) { count ++; unsigned long pivot = selectPivot(array, len); //printf("pivot is %lu, len is %d\n", pivot, len); int posT = partialQuickSortByPivotValue(array, len, pivot); //printf("posT is %d\n", posT); //printArray(array, len); if(pos+posT+1 == k) { break; } else if (pos+posT+1 < k) { pos += posT+1; array += posT+1; len = len - posT - 1; } else { len = posT; } } return data[k-1]; }
void quicksort (float* arr, int size) { if (size <= 1) return; else{ int pivot = selectPivot (arr, size); swp (arr[size-1], arr[pivot]); pivot = size-1; // put all values less than the pivot value after the pivot for (int i=0; i < pivot;){ if ( (arr[i] < arr[pivot]) ){ swp (arr[i], arr[pivot-1]); swp (arr[pivot-1], arr[pivot]); pivot--; } else{ i++; } } quicksort (arr, pivot); quicksort (arr+pivot, size-pivot); } }