快速排序

快速排序思想如下:

將一串序列中某一項作爲基礎pivot,將小於pivot的元素移到pivot的左側,將大於pivot的元素移到右則,這樣就得到了以pivot的基準的兩串子序列,對子序列也做如此排序。

這裏也是用到了分治的策略,先分解再合併。

快速排序分解是難點。以位置low的元素爲基準,設置兩個遊標i=low,j=high。

先從右往左掃描,遇到小於pivot的元素,則p[i],p[j]交換.i++。此時停止向左掃描

再從左往右掃描,   遇到大雨pivot的元素,則p[i],p[j]交換.j++。此時停止向右掃描

判斷i是否小於j,爲真則繼續,直到i==j


代碼:

#include <iostream>

using namespace std;

int getPartition(int *p,int low,int high)
{
    int pivot = p[low];
    int i=low,j=high;
    while(i<j)
    {
        while(p[j] > pivot) j--;
        if(i<j)
        {
            swap(p[i],p[j]);
            i++;
        }

        while(p[i] < pivot) i++;
        if(i<j)
        {
            swap(p[i],p[j]);
            j--;
        }
    }
    return i;
}

void QuickSort(int *p,int low,int high)
{
    if(low<high)
    {
        int mid = getPartition(p,low,high);
        QuickSort(p,low,mid-1);
        QuickSort(p,mid+1,high);
    }
    return ;
}

int main()
{
    int n,i;
    cin>>n;
    int p[n];
    for(i=0;i<n;i++)
        cin>>p[i];
    QuickSort(p,0,n-1);
    for(i=0;i<n;i++)
        cout<<p[i]<<" ";
    return 0;
}

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