快排是不稳定的排序。
复杂度介于nlogn ~n*n 之间(均摊nlogn)。
当每次取值恰好能取到中位数时,复杂度最小,即为n*logn。
当每次取值取到极值时,当待排序数据的重复性很高时,时间复杂度最大,即为n*n
对于无序数据,快排均摊复杂度为n*logn 且常数系数很小,为八大排序中最快。
快排的特性就是快。
//能处理重复数据的快速排序
pair<int,int> partition(vector<int> &nums, int start ,int end)
{
int key,l,r;
int tmp;
key = nums[end];
l = start;//l标记key第一次出现前下前位置
r = start;//r标记key最后一次出现的下一个位置
for(int i = start;i<end;i++){
if(nums[i]<key){//l标记
swap(nums[i],nums[r]);//这个顺序不能颠倒,必须先交换i,r防止ir值相同
swap(nums[l],nums[r]);//
r++;
l++;
}else if(nums[i] == key){
swap(nums[i],nums[r]);
r++;
}
}
swap(nums[end],nums[r]);
return make_pair(l,r);
}
void quick_sort(vector<int> &nums,int start, int end)
{
if(start >= end)
return ;
pair<int,int> pos = partition(nums,start,end);
quick_sort(nums,start,pos.first-1);
quick_sort(nums,pos.second+1,end);
return;
}
void quick_sort(vector<int> &nums)
{
quick_sort(nums,0,nums.size()-1);
}