思路:双指针,首先记录第一个元素,接着,不断的遍历首尾两端,从尾端开始,如果元素小于第一个元素,将他放到A[low],然后开始遍历首元素,大于第一个元素时,放到A[high],直到low和high指向同一个元素,此时将第一个元素放到这个地方,第一次排序结束。然后将剩下被分开的两个区域继续上面操作,直到所有元素排好序为止。
//一次划分
int Partition(int A[],int low,int high);
int pivot=A[low];//记录第一个枢轴元素
while(low<high){//当low不小于high时跳出循环
while(low<high&&A[high]>=pivot) --high;从尾部开始遍历,小于枢轴元素时跳出
A[low]=A[high];
while(low<high&&A[low]<=pivot) ++low;从首部开始遍历,大于枢轴元素时跳出
A[high]=A[low];
}
A[low]=pivot;
return low;
//
void QuickSort(int A[],int low,int high){
if(low<high){
int p=Partition(A,low,high);/划分
Partition(A,low,p-1);//划分左区域
Partition(A,p+1,high);//右区域
}
}
空间复杂度O(logn),
时间复杂度最优O(nlogn),最坏,O(n²),
结合画图会很好理解。