//算法
void quick(int k[ ],int left,int right)
{ int i, j;
int pivot;
if(left<right){
i=left; j=right+1;
pivot = k[left];
while(1){
while(k[++i]<pivot && i!=right) { }
while(k[--j]>pivot && j!=left) { }
if(i<j)
swap(&k[i],&k[j]); /*交换K[i]与K[j]的位置*/
else
break;
}
//为什么是k[left]和k[j]交换呢?因为k[j]一定是从右边数起,的第一个比pivot小的数
swap(&k[left],&k[j]); /*交换K[s]与K[j]的位置*/
quick(k,left,j-1); /* 对前一部分排序 */
quick(k,j+1,right); /* 对后一部分排序 */
}
}
//主程序
void quickSort(int k[],int n)
{
quick(K,0,n-1);
}
这个版本过不了LeetCode-912,原因是每一次选分界元素时都是最左边的那个,这样可能会导致 n 2 n^2 n2的时间复杂度,正确做法是要么随机选取,要么选中间的那个作为分界元素,正确代码如下:
class Solution {
public:
void quick(vector<int>& num,int left,int right){
int i,j;
int pivot;
if(left<right){
i=left,j=right+1;
//下面这句swap就是关键所在
swap(num[left],num[(left+right)/2]);
pivot=num[left];
while(1){
while(num[++i]<pivot&&i<right){}
while(num[--j]>pivot&&j>left){}
if(i<j){
swap(num[i],num[j]);
}
else
break;
}
swap(num[left],num[j]);
quick(num,left,j-1);
quick(num,j+1,right);
}
}
vector<int> sortArray(vector<int>& nums) {
printf("%d",nums.size());
quick(nums,0,nums.size()-1);
return nums;
}
};