結合這幾周的面試來看,快速排序可以說是面試必問的問題之一了,今天就來徹底將這部分內容梳理一下。
快排為啥叫快排,快排是所有排序裡面效能最好的嗎?
快排適合什麼情況呢,還是無論什麼情況下快排總是最好的(顯然no)?
快排演算法的思想是什麼?其效能優良的原因是依賴於演算法中的哪個部分?
作者給出的回答是:
快排的效能在所有排序演算法裡面是最好的,資料規模越大快速排序的效能越優。快排在極端情況下會退化成
的演算法,因此假如在提前得知處理資料可能會出現極端情況的前提下,可以選擇使用較為穩定的歸併排序。
首先,快排運用了二分的思想,首先選擇乙個基準,定義左右兩端指標,先從右向左掃瞄,直到a[j],將a[j]移動到 i 所在位置同時 i++ ,接著從左向右掃瞄,直到 a[i]>=temp,將 a[i] 移動到 j 所在位置同時 j-- ,左右指標從陣列兩端往中間進行靠近,直到 i==j 。而快速排序則要進行多次快排過程,直到劃分的區間最後長度僅為1。
總結下來就是:
void quick_sort(int a,int left,intright)
while(itemp)
i++;
if(i
}a[i]=temp; //基準值是被覆蓋掉的,將其新增回陣列
quick_sort(a,left,i-1
); //遞迴繼續進行快排
quick_sort(a,i+1
,right); //若前面沒有進行副本拷貝,遞迴操作就不太好判斷邊界了}}
圖源:總結上面過程就是:先從右開始對比,之後小於則替換 left 並移動 left ,然後新 left 對比 base 若大於則替換 right 並移動 right ,然後新 right 對比 base ,left 和 right 重合後用 base 替換。它的時間複雜度取決於base值真實在排序後的位置,如果 base 剛好為排序中間的位置,時間複雜度為o(nlogn),如果 base 為數列最大值或最小值,則為o(n2 )。
為什麼快速排序是平均效能最好的排序演算法,其優渥之處體現在哪?
首先,如果我們已經知道 a第二,假如我們已知,a演算法分析:
排序 快速排序
快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...
排序 快速排序
定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...
排序 快速排序
時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...