- 快速排序是排序算法中十分重要的一种方法。
- 快排的优势在于其算法复杂度为(nlogn),相对于选择、冒泡排序算法较低。
- 在编写快排算法时,算法效率的高低很大部分取决于对支点pivot的选择,一般采用自己定义findpivot()函数;通常分为两种情况,第一种是直接选择第一项作为支点,即pivot=first;第二种是采用random随机选择一个数的方式(也可取中点)。
class Solution {
public:
int partition(vector<int>&nums,int i,int j,int p){
do{
while(nums[i]>p)i++;
while(i<j&&nums[j]<=p)j--;
swap(nums[i],nums[j]);
}while(i<j);
return i;
}
int find(int i,int j){
return rand() % (j - i + 1) + i;
//return (i+j)/2;
//return i;
}
void qsort(vector<int>&nums,int i,int j){
if(j<=i) return;
int pivot=findpivot(i,j);
swap(nums[pivot],nums[j]);//将pivot对应value放到最后
int part=partition(nums,i,j,nums[j]);
swap(nums[part],nums[j]);
qsort(nums,i,part-1);
qsort(nums,part+1,j);
}
};
对于findpivot()函数中采用第一位作为pivot的情况,代码可改写为
class Solution {
public:
void qsort(vector<int>&nums,int i,int j){
if(j<=i) return;
int first=i,end=j;
int key=nums[first];//使用第一位作为pivot
while(first<end){
while(first<end && nums[end]>=key) j--;
nums[first]=nums[end];
while(first<end && nums[first]<=key)i++;
nums[end]=nums[first];
}
nums[first]=key;
qsort(nums,i,first-1);
qsort(nums,first+1,j);
}
};