一:解题思路
Time:O(n*log(n)),Space:O(1) 是一种不稳定的排序方法
二:完整代码示例 (C++版和Java版)
C++:
template <typename T> static void Swap(T& a,T& b) { T c(a); a=b; b=c; } template <typename T> static int partition(T array[],int begin,int end,bool min2max=true) { int pivot=array[begin]; while(begin<end) { while((begin<end) && (min2max?(array[end]>pivot):(array[end]<pivot))) end--; Swap(array[begin],array[end]); while((begin<end)&& (min2max?(array[begin]<=pivot):(array[begin]>=pivot))) begin++; Swap(array[begin],array[end]); } return begin; } template <typename T> static void Quick(T array[],int begin,int end,bool min2max=true) { if(begin>=end) return; int pivot=partition(array,begin,end,min2max); Quick(array,begin,pivot-1,min2max); Quick(array,pivot+1,end,min2max); } template <typename T> static void Quick(T array[],int len,bool min2max=true) {
if(len==0) return; Quick(array,0,len-1,min2max); }
Java:
private void Swap(int[] array,int i,int j) { int temp=array[i]; array[i]=array[j]; array[j]=temp; } private int partition(int[] array,int begin,int end) { int pivot=array[begin]; while (begin<end) { while(begin<end && array[end]>pivot) end--; Swap(array,begin,end); while(begin<end && array[begin]<=pivot) begin++; Swap(array,begin,end); } return begin; } private void Quick(int[] array,int begin,int end) { if(begin>=end) return; int pivot=partition(array,begin,end); Quick(array,begin,pivot-1); Quick(array,pivot+1,end); } public void Quick(int[] array) { if(array==null || array.length==0) return; Quick(array,0,array.length-1); }