快速排序

基本思想:

1、先從數列中選取一個數作爲基準數

2、分區過程,將比基準數打的數全部放到它的右邊,小於或等於基準數的放到它的左邊

3、再對左右分區重複第二步,知道各區間只有一個數


例如對數列 6,1,2,7,9,3,4,5,10,8


爲了方便,選擇數列的第一個作爲基準數。

此刻,i = 6, j = 8, 先從序列的兩端開始探測,從右往左找一個小於6的數,找到了就在那個數上方停下,然後i再從左往右找一個大於6的數。然後交換。

第一次交換後得:

6,1,2,5,9,3,4,7,10,8

j繼續向前,找一個小於6的數,找到了就在那個數上方停下,然後i再從左往右找一個大於6的數。然後交換。

第二次交換後得:

6,1,2,5,4,3,9,7,10,8

然後j向前,找到3,同時i向右,與j相遇,第一次探測結束。6和3交換位置。

左右分區類似思想。

#include <stdio.h>
int a[101],n;//定義全局變量,這兩個變量需要在子函數中使用
void quicksort(int left,int right)
{
    int i,j,t,key;
    if(left>right)
       return;
    key=a[left]; //temp中存的就是基準數
    i=left;
    j=right;
    while(i!=j)
    {
        //順序很重要,要先從右邊開始找
        while(a[j]>=key && i<j)
            j--;
        //再找右邊的
        while(a[i]<=key && i<j)
            i++;
        //交換兩個數在數組中的位置
        if(i<j)
        {
          t=a[i];
          a[i]=a[j];
          a[j]=t;
        }
    }
    //最終將基準數歸位
    a[left]=a[i];
    a[i]=key;
    quicksort(left,i-1);//繼續處理左邊的,這裏是一個遞歸的過程
    quicksort(i+1,right);//繼續處理右邊的 ,這裏是一個遞歸的過程
}
int main()
{
    int i,j,t;
    //讀入數據
    scanf("%d",&n);
    for(i=1;i<=n;i++)
      scanf("%d",&a[i]);
    //輸出輸入後的結果
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);

    quicksort(1,n); //快速排序調用
    //輸出排序後的結果
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);

    return 0;
}

結果:


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