排序演算法之——桶排序

來源:互聯網
上載者:User

標籤:std   size   時間複雜度   nod   思路   width   dex   clu   分類   

這是本人的第一篇隨筆,為的是分享學習經驗,和大家討論一些演算法,以便取得些許進步,也是對學習的總結。

話不多說,下面我會用圖文的方式向各位介紹桶排序。

1、主要思想:

  桶排序的大體思路就是先將數組分到有限個桶中,再對每個桶中的資料進行排序,可以說是鴿巢排序的一種歸納結果(對每個桶中資料的排序可以是桶排序的遞迴,或其他演算法,在桶中資料較少的時候用插入排序最為理想)。

2、演算法效率:

  對N個資料進行桶排序的時間複雜度分為兩部分:

  1、對每一個資料進行映射函數的計算(映射函數確定了資料將被分到哪個桶),時間複雜度為O(N)。

  2、對桶內資料的排序,時間複雜度為∑ O(Ni*logNi) ,其中Ni 為第i個桶的資料量。

  對於N個待排資料,M個桶,平均每個桶[N/M]個資料的桶排序平均時間複雜度為:O(N)+O(M*(N/M)*log(N/M))=O(N+N*(logN-logM))=O(N+N*logN-N*logM),當N=M時,即極限情況下每個桶只有一個資料時。桶排序的最好效率能夠達到O(N)。

  對於相同數量的資料,桶的數量越多,資料分散得越平均,桶排序的效率越高,可以說,桶排序的效率是空間的犧牲換來的。

3、演算法分析:

①初始化桶:

  桶排序中的桶其實是一組指向指標的指標,有點類似於雜湊表中的鏈地址法,與之不同的是桶本身也是結構體(圖1是鏈地址法,圖2為初始化後的桶)

  

②將資料放入相應的桶的同時對該桶排序:

  遍曆資料,根據映射函數對資料進行計算,的映射函數為N/10(N是當前資料),確定了桶之後,將資料在桶中採用直接插入法。為對數組a的桶排序。

 

  (中key是桶中資料個數)

  以25和23為例,25/10=2,確定25的位置在第二個桶,此時桶2還沒有元素,所以直接插入,23/10=2,確定在第二個桶,此時桶2的key不為0,23<25將23插入25之前,其他的類似。

③按按照桶的順序將元素輸出:

  按中的情況,排序後的順序就為:10 23 25 26 30 41 43

 

4、代碼展示(C語言):

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int key;
    struct node* next;
}KeyNode;
void bucket_sort(int keys[],int size,int bucket_size);
int main()
{
    int a[]={11,11,9,21,14,55,77,99,53,25};
    int size=sizeof(a)/sizeof(a[0]);
    bucket_sort(a,size,10);
    return 0;
}
void bucket_sort(int keys[],int size,int bucket_size)
{
    KeyNode **bucket_table=(KeyNode**)malloc(bucket_size*sizeof(KeyNode*));
    for(int i=0;i<bucket_size;i++){    //初始化桶
        bucket_table[i]=(KeyNode*)malloc(sizeof(KeyNode));
        bucket_table[i]->key=0;
        bucket_table[i]->next=NULL;
    }
    for(int i=0;i<size;i++){
        KeyNode* node=(KeyNode*)malloc(sizeof(KeyNode));
        node->key=keys[i];
        node->next=NULL;
        int index=keys[i]/10;//給資料分類的方法(關係到排序速度,很重要)
        KeyNode *p=bucket_table[index];
        if(p->key==0){
            p->next=node;
            p->key++;
        }            
        else{
            while(p->next!=NULL&&p->next->key<=node->key){//=的時候後來的元素會排在後面
                p=p->next;
            }
            node->next=p->next;
            p->next=node;
            (bucket_table[index]->key)++;
        }
    }
    KeyNode* k=NULL;
    for(int i=0;i<bucket_size;i++){
        for(k=bucket_table[i]->next;k!=NULL;k=k->next){
            printf("%d ",k->key);
        }    
    }
}

排序演算法之——桶排序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.