快排是不穩定的排序。
複雜度介於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);
}