快速排序簡述

快排是不穩定的排序。

複雜度介於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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章