資料結構與演算法 選擇演算法 selection

2021-07-27 00:17:54 字數 1861 閱讀 3281

選擇演算法指的是解決選出序列中第n大的元素。比如中位數。

方法如下:

1.使用priorityqueue,維持size為k,如果queue的size小於k,則直接加入,否則看最小的元素能否比得過,比得過就剔除最小元素,加入新元素,比不過就看後面的元素,最後返回堆頂元素即可。這裡需要使用最小堆。

public int findkthmax(int array, int k)

} return minheap.peek();

}

2.快速選擇,使用了快排中的partition思想,每一次劃分都是on複雜度。思路是選擇乙個軸元素pivot,把陣列做一次劃分,pivot左邊都是小的等於pivot的,右邊是大於pivot的,然後看pivot的位置,如果就是a.length - k,說明,pivot右側有k-1個元素,那麼pivot就是第k大的元素,否則如果位置小於a.length - k,那麼應該在左半邊尋找,否則在右半邊尋找。

寫這個演算法有乙個小技巧,在初始化的時候就直接把第k大轉換成陣列的索引位置,後面的所有比較都是基於索引位置的而不是第幾大,寫起來更簡單。

這個演算法的最壞複雜度是on2,每一次都恰好分為了個數為1的一組。最好是onlogn。《演算法導論》中指出,如果採用隨機演算法,即partition的pivot是隨機選擇的,那麼平均複雜度是onlogn,注意這是平均,最壞仍然是on2。

那麼如何實現隨機化的partition,很簡單,原本我們是預設選第乙個元素為pivot的,這時只需要隨機選乙個元素作為第乙個元素即可,即先做一次隨機的交換。

**:

public int findkthlargest(int nums, int k) 

public int findkthsmallest(int nums, int k, int start, int end)

int index = partition(nums, start, end);

if (index == k) else if (index < k) else

}private int partition(int nums, int start, int end)

int pivot = nums[start];

int last = start;

for (int i = start + 1; i <= end; i++)

}swap(nums, start, last);

return last;

}private void swap(int nums, int i, int j)

3. bfptr演算法,該名稱來自五個發明者的名字,是對上述快速選擇的改進,主要是對最差情況的改進,優化pivot的選擇。可以證明最差是on。

(1)先把array分為每組包含5個元素的組,最後一組可能不滿;找出每一組的中位數,並且移動至array的前面,方便後續尋找;這一步是特殊的case,用乙個插入排序就可以實現。

(2)找出中位數的中位數,這一步是一次遞迴地呼叫;

(3)得到pivot以後,按照pivot來partition;然後分3個case,類似於快速選擇。

下面是一些別人的實現:

時間複雜度分析:(1)步需要on;(2)步需要t(n/5);(3)考慮最壞情況,那麼就是沒有找到,需要遞迴到高位或者地位去尋找,相當於遞迴呼叫了一次bfptr演算法。那麼我們需要得到遞迴地元素個數。假設中位數的中位數是x,那麼有一半的組中,至少含有3個元素大於x,即1/2 * n/5 * 3 = 3/10 * n。那麼至多有n-3/10 * n = 7/10 * n 元素是大於x的。同理至多有7/10 * n小於x的。因此這一步至多需要t(7/10*n)。要注意,這裡中位數的中位數並不是中位數,所以不是2/n,即一分為二。那麼,總的複雜度是on。可以把上述式子展開等比數列計算,或者使用主定理。

資料結構與演算法 選擇排序演算法

選擇排序的基本思想是 如果共有n個元素,那麼第一輪的時候就再n個元素中找到最小的元素,如果它不是排在第乙個,就讓它與第乙個元素交換位置。第二輪再在除去最前面的元素 也就是上一輪找到的最小元素 中,再找到最小的元素,使它的位置確定在當前這些元素的最前面。以此類推。每一輪都可以確定乙個元素的位置,只需要...

資料結構與演算法 選擇排序

選擇排序 從小到大 的基本思想是,首先,選出最小的數,放在第乙個位置 然後,選出第二小的數,放在第二個位置 以此類推,直到所有的數從小到大排序。在實現上,我們通常是先確定第i小的數所在的位置,然後,將其與第i個數進行交換。下面,以對 3 2 4 1 進行選擇排序說明排序過程,使用min index ...

資料結構與演算法 選擇排序

1 什麼是程式?程式 資料結構 演算法 2 選擇排序 selection sort 基本思想 我們從第乙個位置開始,依次和後面的值進行比較,如找到比第乙個值小的,二者進行交換。交換後第乙個位置的值已經確定下來,我們再從第二個位置開始,依次和後面的進行比較,依次類推,知道所有的值都比較完成,到此選擇排...