常見排序演算法思想

2021-08-29 04:16:17 字數 1380 閱讀 9590

穩定的排序演算法有:

1.氣泡排序:將小的數往前挪,將大的數往後挪。

2.插入排序:移動第i+1的那個數,在此數之前的序列中,從後往前進行比較相鄰的兩個數,將更小的數放前面,保證每次第i+1個之前的子串行有序。

3.歸併排序:利用分治的思想,將乙個無序的陣列分解若干以兩個數為一組的子陣列,然後將每個子陣列進行排序,可以得到若干連續的有序陣列,再次合併排序合併直至最後為乙個陣列。

不穩定的排序演算法有:

1.選擇排序:每次都選擇最小的數跟前面的數交換。

2.快排:也是利用分治的思想,以陣列arr中的第i數為基準,將比arr[i]大的數放在一邊,比arr[i]小的數放在一邊。每個子陣列一次類推即可完成快排。

3.希爾排序:取乙個任意基準數(一般取集合長度的一半),然後將序列下標為該基數的倍數的數作為乙個集合進行插入排序,通過縮小基數(新基數=基數/2),每改一次進行一次插入排序,直至基數為1為止即可完成希爾排序。

4.堆排:將陣列建成乙個大堆,然後將堆頂的數和堆低的數進行交換,然後堆的大小減1再次調整為大堆,再次交換以此類推,直至堆的大小為1。

各個排序演算法的使用場景:

對於資料量小的,基於他們的穩定性選擇冒泡和插入排序。

對於資料相對有序的情況,我們也可以使用冒泡和插入或者快排,這時他們效率最高。

當資料量大的時候優先考慮歸併,堆排,快排。

當資料完全屬於無序的,使用快排最佳,但是堆排的空間複雜度最低,如果要求穩定性就要選擇歸併排序。

一般沒有特殊的要求,快排還是比較常用的。

寫乙個簡單的快排

int divarray(int arr,int left,int right) {

int key = arr[right];

int k = left;

for (int i = left; i < right; ++i) {

if (arr[i]top k問題以及大資料查詢問題(高頻)

這個問題是常問的問題,一定要答的精彩一點。

首先這個問題一定要追問面試官,具體的細節相關,如果是單純的排序問題則是選擇快排和堆排,堆排就可以使用優先順序佇列。

如果是具體的場景,比如要是找出微博熱搜的前k個熱搜話題,這時就可以問問面試官,記憶體是否夠用?伺服器有多少?單核還是多核?

如果對記憶體有要求且單一伺服器,則應該先對檔案進行雜湊切分,切分為多個小檔案,在再每個檔案裡面用雜湊表統計次數,再進行排序,排完序取出前k個,再歸併排序這些資料。

如果是分布式的伺服器,則需要先在每個伺服器上先用堆排或者快排求出前k個,求完之後再把這些前k個資料組合歸併起來,之後再使用一次堆排。求出前k。

常見演算法思想

演算法 窮舉演算法思想 exhaustive attack method 窮舉演算法是最簡單的一種演算法,其依賴於計算機的強大計算能力來窮盡每一種可能的情況,從而達到求解問題的目的。窮舉演算法效率並不高,但是適應於一些沒有明顯規律可循的場合 窮舉演算法的基本思想就是從所有可能的情況中搜尋正確的答案,...

演算法思想 排序

排序並不是一種演算法思想,而是基於遍歷的一種演算法實現。形形色色的排序演算法,並不能絕對的認為哪一種排序最好,因為最好的度量指標究竟是耗時 記憶體占用亦或是穩定性是不確定的,這個要根據使用場景來決定,但是我們必須掌握各種排序方法的實現原理,這樣才能做到 具體問題具體分析 下圖為多種排序演算法的特性歸...

常見的演算法思想

把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題,直到最後子問題小到可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法 快速排序,歸併排序 傅利葉變換 快速傅利葉變換 大資料中的mr,現實中如漢諾塔遊戲。分治法對問題有一定的要...