排序演算法之——桶排序
這是本人的第一篇隨筆,為的是分享學習經驗,和大家討論一些演算法,以便取得些許進步,也是對學習的總結。
話不多說,下面我會用圖文的方式向各位介紹桶排序。
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
③按按照桶的順序將元素輸出:
按上圖中的情況,排序後的順序就為:10 23 25 26 30 41 43
4、程式碼展示(C語言):
#include
#include
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_table[i]->key=0;
bucket_table[i]->next=NULL;
}
for(int i=0;i
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->keykey){//=的時候後來的元素會排在後面
p=p->next;
}
node->next=p->next;
p->next=node;
(bucket_table[index]->key)++;
}
}
KeyNode* k=NULL;
for(int i=0;i
printf("%d ",k->key);
}
}
}
原文出處:https://www.cnblogs.com/Unicron/p/9461075.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2001/viewspace-2806942/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 常用排序演算法之桶排序排序演算法
- 排序演算法__桶排序排序演算法
- 基於桶的排序之計數排序排序
- 桶排序排序
- 排序演算法之歸併,快速,堆和桶排序演算法
- 基於桶的排序之基數排序以及排序方法總結排序
- 桶排序和基數排序排序
- 【資料結構與演算法】非比較排序(計數排序、桶排序、基數排序)資料結構演算法排序
- 排序演算法之 '快速排序'排序演算法
- 桶排序2排序
- 桶排序 選擇,插入排序排序
- 非交換排序-計數排序和桶排序排序
- 計數排序vs基數排序vs桶排序排序
- 《演算法筆記》5. 字首樹、桶排序、排序演算法總結演算法筆記排序
- 排序演算法之 '歸併排序'排序演算法
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- 每天一道演算法題--排序之桶排序實現求排序後相鄰最大差值問題演算法排序
- PHP 排序演算法之選擇排序PHP排序演算法
- PHP 排序演算法之希爾排序PHP排序演算法
- PHP 排序演算法之插入排序PHP排序演算法
- Python排序演算法之 選擇排序Python排序演算法
- 排序演算法之折半插入排序排序演算法
- Java排序演算法之氣泡排序Java排序演算法
- 排序演算法之「選擇排序(SelectionSort) 」排序演算法
- 排序演算法入門之「選擇排序」排序演算法
- 排序演算法入門之「插入排序」排序演算法
- 排序演算法之快速排序的實現排序演算法
- 排序演算法之「插入排序(Insertion Sort)」排序演算法
- 排序演算法之「歸併排序(Merge Sort)」排序演算法
- hive分桶表排序Hive排序
- 畫江湖之演算法篇【排序演算法】快速排序演算法排序
- 畫江湖之演算法篇 [排序演算法] 快速排序演算法排序
- 手寫演算法並記住它:桶排序演算法排序
- 【JS面試向】選擇排序、桶排序、氣泡排序和快速排序簡介JS面試排序
- 夯實基礎:排序演算法之堆排序排序演算法
- 看動畫學演算法之:排序-count排序動畫演算法排序
- 看動畫學演算法之:排序-快速排序動畫演算法排序
- 排序演算法之「快速排序(Quick Sort) _c++ 」排序演算法UIC++