"

注册即送39 无需申请拥有全球最顶尖的原生APP,每天为您提供千场精彩体育赛事,注册即送39 无需申请更有真人、彩票、电子老虎机、真人电子竞技游戏等多种娱乐方式选择,注册即送39 无需申请让您尽享娱乐、赛事投注等,且无后顾之忧!

"
首頁 > STL之sort函數詳解 ( 為什么sort要用插入排序? 為什么插入排序在大致有序的情況下效率會比較高 ? )

STL之sort函數詳解 ( 為什么sort要用插入排序? 為什么插入排序在大致有序的情況下效率會比較高 ? )

互聯網 2021-04-12 21:43:40

一朋友面試的時候被問到了STL里的sort函數,被懟到懷疑人生,我聽了那些問題發現也不會,研究了好久,網上也沒有詳細解釋的,今天突然靈感爆發,想明白了幾個問題 可能有的人會覺得sort這么簡單, 有什么好問的, 那你可以看看如下幾個問題你能否答得上來

sort是用什么排序實現的?(或者說sort如何優化?)

實際上,STL中的sort是一種混合排序,它應用了快速排序、堆排序和插入排序,以下是各個排序應用時的情況:

開始時使用的是快速排序當遞歸深度超過logn時,為了防止快速排序退化,sort會改用為堆排序當遞歸深度小于logn時,但是區間長度小于等于16時,改用插入排序

當你回答出這些時,面試官就可以繼續深入問下去了

快速排序是怎么實現的?(時空復雜度)

這個問題我一般都這么回答:快速排序是基于分治法的一種排序法,對于整個排序區間,先找一個樞紐,比如這個區間的第一個數,然后把比這個樞紐小的數放左邊,比樞紐大的放右邊,對樞紐的左右兩個區間進行剛剛相同的步驟,當區間長度都為1時,就排好序了

時間復雜度為nlogn,空間復雜度為logn

快速排序最差復雜度?如何優化?

快速排序最差復雜度為n^2

快速排序優化就只有一個地方,那就時樞紐的選擇,優化方法有兩種,一種是在區間內隨機選取一個樞紐,第二種就是STL中sort快速排序部分使用的優化:取區間第一個數,中間的數以及最后一個數的中位數作為樞紐

快速排序中如何實現你說的“小的放樞紐左邊,大的放樞紐右邊”這個操作?

實際上這個操作在STL里有個函數可以專門實現——partition函數,它的復雜度是o(n)的,它的實現過程如下:

取區間第一個數,中間的數以及最后一個數的中位數作為樞紐,把該樞紐與區間第一個數位置交換一下,用一個臨時變量儲存樞紐,然后使用雙指針的思想,i 指針指向區間第一個數,j 指針指向區間最后一個數,接下來有兩個操作

j 指針從后往前跑,當找到一個比樞紐小的數,便將該數放到i指針的位置(直接覆蓋)i 指針從前往后跑,當找到一個比樞紐大的數,便將該數放到j指針的位置(直接覆蓋)

交替重復以上兩個操作,當i和j指針相遇時,把樞紐放入相遇位置就行了

為什么sort要用堆排序?

這個時候就不要再回答為了防止快速排序退化了,其實面試官想問的是nlogn復雜度的排序算法還有比如歸并排序,那為什么要選擇堆排序?

這個時候就要從空間復雜度上回答了,堆排序是可以原地實現的,空間復雜度為o(1),而歸并排序空間復雜度為o(n)

堆排序具體怎么實現的?

這時候就不要說什么用堆實現,不要就講一下堆的結構什么的,面試官都問具體實現了,那么建堆操作也是要具體講清楚的,不多解釋,直接上代碼

//代碼來自https://github.com/huihut/interview/blob/master/Algorithm/HeapSort.cpp#include #include using namespace std;// 堆排序:(最大堆,有序區)。從堆頂把根卸出來放在有序區之前,再恢復堆。void max_heapify(int arr[], int start, int end) {//建立父節點指標和子節點指標int dad = start;int son = dad * 2 + 1; //它數組從0開始,所以堆中父親左右兒子是dad*2+1和dad*2+2while (son//否則交換父子內容再繼續子節點和孫節點比較swap(arr[dad], arr[son]);dad = son;son = dad * 2 + 1;}}}void heap_sort(int arr[], int len) {//初始化,i從最後一個父節點開始調整(就是從葉子的父親開始調整)for (int i = len / 2 - 1; i >= 0; i--)max_heapify(arr, i, len - 1);//先將第一個元素和已經排好的元素前一位做交換,再從新調整(剛調整的元素之前的元素),直到排序完畢(想到于不斷地把堆頂取出來放后面,類似選擇排序的過程,只不過用堆進行了優化)for (int i = len - 1; i > 0; i--) {swap(arr[0], arr[i]);max_heapify(arr, 0, i - 1);}}int main() {int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };int len = (int) sizeof(arr) / sizeof(*arr);heap_sort(arr, len);for (int i = 0; i
免責聲明:非本網注明原創的信息,皆為程序自動獲取互聯網,目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責;如此頁面有侵犯到您的權益,請給站長發送郵件,并提供相關證明(版權證明、身份證正反面、侵權鏈接),站長將在收到郵件12小時內刪除。
注册即送39 无需申请 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>