排序演算法系列(1) 桶排序

2022-06-28 15:27:12 字數 1187 閱讀 5261

桶排序是一種把元素分散到不同桶中的排序演算法。接著把每個桶再獨立地用不同的排序演算法進行排序。桶排序的概覽如下所示:

待排序序列:1、45、30、23、20、10、13、34

在上面的例子中,我們有 8 個未排序的整數。我們首先來建立五個桶,這五個桶分別包含 [0,9], [10,19], [20, 29], [30, 39], [40, 49][0,9],[10,19],[20,29],[30,39],[40,49] 這幾個區間。這 8 個元素中的任何乙個元素都在乙個桶裡面。對於值為 xx 的元素來說,它所屬桶的標籤為 x/w,在這裡我們讓 w = 10。對於每個桶我們單獨用其他排序演算法進行排序,最後按照桶的順序收集所有的元素就可以得到乙個有序的陣列了。

示例 1:

輸入: nums = [1,2,3,1], k = 3, t = 0

輸出: true

我們不妨把把每個元素當做乙個人的生日來考慮一下吧。假設你是班上新來的一位學生,你的生日在三月的某一天,你想知道班上是否有人生日跟你生日在 t=30天以內。在這裡我們先假設每個月都是30天,很明顯,我們只需要檢查所有生日在二月、三月、四月的同學就可以了。

之所以能這麼做的原因在於,我們知道每個人的生日都屬於乙個桶,我們把這個桶稱作月份!每個桶所包含的區間範圍都是 t,這能極大的簡化我們的問題。很顯然,任何不在同乙個桶或相鄰桶的兩個元素之間的距離一定是大於 t 的。

我們把上面提到的桶的思想應用到這個問題裡面來,我們設計一些桶,讓他們分別包含區間 ..., [0,t], [t+1, 2t+1], ...。我們把桶來當做視窗,於是每次我們只需要檢查 xx所屬的那個桶和相鄰桶中的元素就可以了。終於,我們可以在常量時間解決在視窗中搜尋的問題了。

還有一件值得注意的事,這個問題和桶排序的不同之處在於每次我們的桶裡只需要包含最多乙個元素就可以了,因為如果任意乙個桶中包含了兩個元素,那麼這也就是意味著這兩個元素是 足夠接近的 了,這時候我們就直接得到答案了。因此,我們只需使用乙個標籤為桶序號的雜湊表就可以了。

public

class

solution

public

boolean containsnearbyalmostduplicate(int nums, int k, int

t)

return

false

; }

}

演算法系列 排序演算法(1)氣泡排序

排序 在資料處理中經常都會看到,它作為資料結構和演算法中的重要組成部分,還是需要我們系統地進行學習。對於排序的認知,我一直都處於就是對資料進行由大到小或者由小到大的排序,但具體是怎樣進行的,卻一直都沒辦法描述清楚,希望通過這次深入的學習,可以掌握更多關於排序的認知。1.程式設計師內功 八大排序演算法...

排序演算法系列 1 歸併排序

知識點 歸併排序 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。歸併排序是一種穩定的排序方法。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為...

排序演算法系列

概述 概念 排序是計算機內經常進行的一種操作,其目的是將一組 無序 的記錄序列調整為 有序 的記錄序列。排序分為內部排序和外部排序。若整個排序過程不需要訪問外存便能完成,則稱此類排序問題為內部排序。反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問題為外部排序。排...