void quick_sort_partition(void * base,size_t left,size_t right,size_t size,int(* compare)(const void *,const void *)){ size_t p=(left+right)/2; void * pivot=malloc(size); memcpy(pivot,base+p*size,size); size_t i,j; for(i=left,j=right;i<j;) { while(!(i>p||compare(pivot,base+i*size)<0)) i++; if(i<p) { memcpy(base+p*size,base+i*size,size); p=i; } while(!(j<=p||compare(base+j*size,pivot)<0)) j--; if(p<j) { memcpy(base+p*size,base+j*size,size); p=j; } } memcpy(base+p*size,pivot,size); free(pivot); if(p-left>1) quick_sort_partition(base,left,p-1,size,compare); if(right-p>1) quick_sort_partition(base,p+1,right,size,compare); }
void operator()(T* first, T* last) { // Assume pointers values are incremental if (first < last) { T* p = quick_sort_partition(first, last); operator()(first, p); operator()(p + 1, last); } } // end of operator()
void quick_sort(int a[], int start, int end) { if(end <= start) // why less than happens ( this is because partion +/- 1 return; int partition = quick_sort_partition(a, start, end); //print(); quick_sort(a, start, partition-1); quick_sort(a, partition+1, end); }
void Sort::partial_quick_sort(std::vector<int>& _source, int _from, int _to) { if (_from > _to) return; int v = quick_sort_partition(_source, _from, _to); partial_quick_sort(_source, _from, v-1); partial_quick_sort(_source, v+1, _to); }
void quick_sort(T* elements, size_t low, size_t high, int(*compare)(const T&, const T&)) { while (true) { if (low >= high) return; size_t new_pivot = quick_sort_partition(elements, low, high, (low+high)/2, compare); if (new_pivot != 0) quick_sort(elements, low, new_pivot-1, compare); if (new_pivot >= m_size-1) low = new_pivot + 1; else break; } }
void quick_sort(void* base,size_t nmemb,size_t size ,int(*compare)(const void *,const void*)){ #ifdef PRINT_FUNCTION_NAME printf("%s\n",__FUNCTION__); #endif quick_sort_partition(base,0,nmemb-1,size,compare); }