動畫 什麼是桶排序?

2022-07-03 19:30:15 字數 1165 閱讀 8400

桶排序和計數排序一樣,不受o(nlogn)時間複雜度下限的影響,它將待排序序列通過遍歷方式分到有限數量的桶中,然後每個桶被單獨地排序,不管是使用同乙個比較類排序演算法或者使用不同的排序演算法,或者還是遞迴地使用桶排序。桶排序可以通過比較方式實現,也可以通過非比較方式實現。

通過比較方式的桶排序分為4步工作步驟:

1.設定合適數量的分桶;

2.遍歷待排序序列,將每個元素放入到對應的桶中;

3.對每個非空桶進行合適的排序演算法;

4.按順序訪問桶,將桶中的元素依次放回到原序列中對應的位置。

關於如何設定合適數量的分桶,我們這裡分為兩種:設定簡單的分桶和歸約化的分桶。

假設我們輸入陣列[13, 9, 15, 1, 7, 11, 25, 21, 29, 17, 5],求陣列中的最大值和最小值,max = 29,min = 1,設定分桶的情況為max / 10 – min / 10 + 1 = 3。所以我們設定合適的數量為3桶,從0開始。陣列中第乙個元素是13,進行(13 - min) / 10的運算,得2,放入到第3 個桶;陣列中第2個元素是9,(9 - min) / 10 = 0,放入到第1個桶;依此類推。

分布完之後按順序訪問桶,將桶中的元素依次放回到原序列中對應的位置。

動畫:簡單分桶

code:簡單分桶

code:插排

如果元素之間的大小跨度比較大,例如我們輸入[103, 9, 105, 1, 7, 101, 205, 201, 209, 107, 5],按照簡單分桶情況的話,它的桶數量是209 / 10 – 1 / 10 + 1 = 21是極為不合理的,中間會浪費掉比較多的空桶。

所以和計數排序的歸約化分治一樣,桶排序也做歸約化分桶,情況設為(array[i] - min) / (max - min) * array.length。

我們採用hashmap的方式記錄桶的情況,每次將陣列中的元素輸入到情況去,得到的分桶值作為key,新增元素的動態陣列物件作為value。 陣列遍歷完之後也按順序訪問桶,將桶中的元素依次放回到原序列中對應的位置。

動畫:歸約分桶

code:歸約化分桶

什麼是桶排序?

首先說一下桶排序的桶是什麼概念,這裡的 桶 是乙個區間範圍,裡面可以承載乙個或多個元素。桶排序的第一步就是確定桶的個數和區間。具體的建立多少個桶 每個桶的區間範圍是多少,有不同的方式,我們這裡使用桶的數量等於原始數列的元素的數量 為什麼等於數列的數量,後面會講到 除了最後的乙個桶只包含最大值,其他的...

什麼是計數排序和桶排序

概念 計數排序演算法不是基於元素比較,而是利用陣列下標來確定元素的正確位置。設計乙個統計陣列,將原始資料的次數統計一下。特點 待排序的資料作為陣列的下標存放,陣列的值是該下標資料出現的次數。這樣遍歷一遍這個陣列就可以有序的取出下標值,即原資料。可以以數列的最小值作為偏移量,比如原始數列的最小值是90...

動畫 什麼是希爾排序?

上篇寫的直接插入排序演算法時間複雜度是o n 2 如果要令此排序演算法的時間複雜度要低於o n 2 必須是 遠距離的元素交換 使得這組元素能提高有序的程度,然後進行直接插入排序的時候可以減少交換的工作量。那通過什麼減少交換的工作量呢?希爾排序可以解決這個問題。希爾排序在做直接插入排序之前,希望可以對...