根据算法导论上的流程,将数组最后一个数作为主元,i和j都是从start往end移动。
void QuickSort(T*source,size_t length){ if(!source){ return; } QSort(source,0,length-1); } template<typename T> void Qsort(T*source,size_t start,size_t end){ if(start<end){ int pivot = Partition(source,start,end); Qsort(source,start,pivot-1); Qsort(source,pivot+1,end); } } template<typename T> size_t Partition( T*source, int start, int end ){ if(start>end || !source){ throw std::runtime_error("Invalid Input"); } //T temp = source[start]; size_t i = start-1; for(size_t j = start;j<end;j++){ if(source[j]<=source[end]){ i++; swap(source[j],source[i]); } } swap(source[i+1],source[end]); return i+1; }
如果,需要记录原数组的位置标记。下面的程序已数组的第一个为主元,i从start往后指示第一个大于主元的位置,j从end往前指示第一个小于主元的位置,每次交换数组的两个位置的数据,id记录数组当前的数据是未排序前数组的哪一项。
template <typename T> void QuickSort( T*source, size_t* id, size_t length ) { if(!source || length < 2) return; QSort( source, id, 0, length -1); } template <typename T> void QSort( T*source, size_t* id, int start, int end ) { if(start < end) { int pivot = Partition(source, id, start, end); QSort(source, id, start, pivot-1); QSort(source, id, pivot+1, end); } } template <typename T> size_t Partition( T*source, size_t* id, int start, int end ) { if(start > end || !source) throw std::runtime_error("Invalid Input"); T temp = source[start]; size_t tmpID = id[start]; while(start < end) { while(start < end && source[end] >= temp) end--; source[start] = source[end]; id[start] = id[end]; while(start < end && source[start] <= temp) start++; source[end] = source[start]; id[end] = id[start]; } source[start] = temp; id[start] = tmpID; return start; }