想準備將所有的排序演算法都總結出來,方便你查閱,也方便我複習和記憶,下面來說桶排序:
首先必須申明,桶排序和計數排序完全不同,不可混為一談:(這裡例項用單鏈表來操作)
還是老方法,看文字就是煩,直接上圖,**結合,永遠都是王道:
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 ...