用分治法的快速排序(c++)

快速排序的主要思想:找出數組的第一個數字做爲參照物,從數組第一個數字日後開始比較,同時,從數組最後一個數字往前比較,若是前面的數字比參照值大,找出來,後面的數字比參照值小找出來,他們相互交換位置,當他們相遇了,中止。這樣的結果是,相遇點的前面的數字都是比參照值小的,相遇點後面的值都是比參照值大,而後再相遇點分割成兩塊,各自進行剛纔的操做。ios

源代碼以下。數組

#include<iostream>ui

using namespace std;spa

 

inline void Swap(int &x,int &y)     //交換x,y排序

{遞歸

       int temp=x;ci

       x=y;it

       y=temp;io

}stream

 

int Partition(int a[],int p,int r) 

//Partition 以肯定一個基準元素a[q]對子數組a[p:r]進行劃分

{

       int i=p,j=r+1;

       int x=a[p];

       //<x的元素交換到左邊區域

       //>x得元素交換到右邊區域

       while(true)

       {

        while(a[++i]<x&&i<r);

        while(a[--j]>x);

        if(i>=j) break;

        Swap(a[i],a[j]);    //交換a[i],a[j]

       }

a[p]=a[j];

a[j]=x;

return j;    //返回劃分點

}

 

void QuickSort(int a[],int p,int r)   

//利用遞歸進行快速排序

{

       if(p<r)

       {

        int q=Partition(a,p,r);   

//Partition返回劃分點j,此處使q=j

        QuickSort(a,p,q-1);

        QuickSort(a,q+1,r);

       }

}

 

int main()

{  

       int len;

       cout<<"請輸入數組長度: ";

       cin>>len;

       int *a=new int[len];         

//動態生成一個長度爲len的數組

       cout<<"請輸入一個數組: ";

    for(int i=0;i<len;i++)     //輸入數組

        cin>>a[i];

       QuickSort(a,0,len-1);     //對數組進行快排

       cout<<"排序後的數組是:";

       for(int j=0;j<len;j++)

        cout<<a[j]<<" ";      //輸出數組

       cout<<endl;

       delete[] a;    

       return 0;

}

相關文章
相關標籤/搜索