1. 程式人生 > >【排序】1.1簡單桶排序

【排序】1.1簡單桶排序

簡單的“桶排序”:書中介紹的桶排序是藉助一維陣列解決問題。將陣列下標作為已經排序的序列,將值存入陣列中對應的位置,達到排序的目的。

題目一:5個同學分別考了5分、3分、5分、2分、8分,滿分為10分;讓計算機隨機讀入這5個數,按照分數從大到小輸出。

輸出結果:8 5 5 3 2

解:

思路:1.初始化大小為11的陣列a[0]-a[10];

   2.分數對於陣列下標,存在則+1,代表出現的次數,比如,若5分,a[5]=1;

   3.順序輸出,陣列中值表示輸出次數。

實現(C):

#include<stdio.h>
int main()
{
    int a[11],i,j,x;
    for(i=0;i<=10;i++)
    {
        a[i]=0;
    }

    for(i=0;i<5;i++)
    {
        scanf("%d",&x);
        a[x]++;
    }

    for(i=10;i>=0;i--)
    {
        for(j=1;j<=a[i];j++)
        {
            printf("%d",i);
        }
    }

    getchar();getchar();
    return 0;

}
題目二:若對0-1000範圍內的整數進行排序呢?

解:

思路:如上題,需要大小為1001的陣列,1001個桶,來表示0-1000之間每個數出現的次數。

實現(C):

#include<stdio.h>

int main()
{
    int a[1001],i,j,x,n;

    for(i=0;i<=1000;i++)
    {
        a[i]=0;
    }

    scanf("%d",&n);

    for(i=0;i<n;i++)
    {
        scanf("%d",&x);
        a[x]++;
    }

    for(i=0;i<=1000;i++)
    {
        for(j=1;j<=a[i];j++)
        {
            printf("%d ",i);
        }
    }
    return 0;
}
時間複雜度(如題二):

第一個迴圈執行m次(m為桶的個數),第二個迴圈執行n次(n為待排序數的個數),第三、四個迴圈共執行m+n次,共2*(m+n)次;

表示為O(2*(m+n)),忽略掉較小的常數,時間複雜度表示為O(M+N)。

總結:簡化版的桶排序,速度非常快,但有侷限性。