淺顯易懂的桶排序

2021-07-11 17:51:01 字數 1859 閱讀 9121

想準備將所有的排序演算法都總結出來,方便你查閱,也方便我複習和記憶,下面來說桶排序:

首先必須申明,桶排序和計數排序完全不同,不可混為一談:(這裡例項用單鏈表來操作)

還是老方法,看文字就是煩,直接上圖,**結合,永遠都是王道:

1.假設:桶待排序列:

看了之後有沒有特莫感覺就是雜湊桶,哈哈,滿足一定條件差不多就是啦;言歸正傳,key值就是待排序序列,bucket為桶,資料按某種函式,對映到桶中

2.關於對映及桶排原理分析:

桶中資料的十位都一樣,那麼對映函式算出的桶號就是這些資料的十位,也就是說,這種對映函式,目的就是為了找出資料的共同特點,可能是求餘(雜湊表直接定址,就是這樣),可能是除某數求商,本例中就是取商;

即就是所有資料除某數取得的商相同的都放乙個桶中,如圖中的3號桶,剛開始,3號桶中的資料是無序的,第一遍操作,只能保證這些資料一定是在這個桶中,

但是桶中的順序還是要排的,之後,遍歷一遍桶,輸出即就是乙個有序序列,就這幾句話,我感覺說完了,至於更深層 的剖析,稍後再說,先來**:

#pragma once

//每乙個節點的結構

struct node

;//宣告:

void printbucketsort(node** bucket, int bucket_size);

int f(int x);

void bucketsort(int* a, int size,int bucket_size)

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

//該桶號不為空,那麼插入排序

else

sub_node->next = sub_head->next;

sub_head->next = sub_node;

bucket[num]->key++;

} }//列印

printbucketsort(bucket, bucket_size);

}//對映函式

int f(int x)

//列印

void printbucketsort(node** bucket, int bucket_size)

} cout << endl;

}void test7()

; cout << "桶排序" << endl;

bucketsort(a, 10, 10); //桶資料最大才97,所以需要10個桶

}

哎呀,敲了我十幾分鐘,看看結果:

第乙個就是排序,第二個就是資料在桶中的分布,橫行代表桶,10個桶,沒有資料的桶是0;

桶排序就是這樣:

對於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)。

桶排序的平均時間複雜度為線性的o(n+c),其中c=n*(logn-logm)。如果相對於同樣的n,桶數量m越大,其效率越高,最好的時間複雜度達到o(n)。 

當然桶排序的空間複雜度 為o(n+m),如果輸入資料非常龐大,而桶的數量也非常多,則空間代價無疑是昂貴的。

此外,桶排序是穩定的。

賜教!

淺顯易懂的委託

一 我對委託的理解 委託是方法的容器,它不生產方法,它只是方法的搬運工。委託這個詞用到程式設計裡面對於很多新人來說可能都不太好理解,以前剛接觸委託的時候也看過不少文章,對於這個詞的解釋大多都雲裡霧裡。但把 委託 換成 託付 對於它的理解可能會清晰不少。例如,劉備將兒子委託給了趙雲和劉備將兒子託付給了...

KMP演算法(淺顯易懂)

kmp演算法求解什麼型別問題 字串匹配。給你兩個字串,尋找其中乙個字串是否包含另乙個字串,如果包含,返回包含的起始位置。講道理 大串a 長度n 小串b 長度m 一般匹配字串,乙個乙個比,當前字元對了則比對下乙個,不對了再從b的頭開始比,移動乙個位置 這樣的時間複雜度是o n m kmp可以實現複雜度...

python中yield的用法 淺顯易懂

def consumer name print s 準備吃包子啦 name while true baozi yield return返回的值.print 包子 s 來了,被 s 吃了 baozi,name c consumer 小華 print 華麗分割線1 print c.next print ...