快速排序是一種非常高效的排序演算法,它採用了「分而治之」的思想,把大的拆分為小的,小的拆分為更小的。
原理:
對於乙個給定的記錄,通過一趟排序後,將原序列拆分為兩個部分,其中前面一部分的所有記錄均比後一部分的所有記錄小,然後在依次對前後兩部分的記錄進行快速排序,遞迴該過程,直到序列中所有的記錄均為有序為止。整個演示的過程:
初始化關鍵字【49,38,65,97, 76,13,27,49】**示例:第一趟排序【27,38,13】,49,【76,97,65,49】
第二趟排序,27,,49,【49,65】,76,
第三趟排序 13,27,38,49,49,,76,97
最後的排序結果 13,27,38,49,49,65,76,97
public
static
void
quicksort
(int
array,
int low,
int high)
i = low;
j = high;
index = array[i]
;while
(i < j)
//這個地方的判斷其實就是表明了array[j] < index,這時就找到了需要和array[i]交換為止的地方
if(i < j)
//外層進行一次迴圈會從前和從後進行兩次掃瞄
while
(i < j && array[i]
<= index)
if(i < j)
}//注意,每一次的掃瞄必然會空出乙個位置,這個位置就是比較元素index的位置
array[i]
= index;
quicksort
(array, low, i -1)
;quicksort
(array, i +
1, high)
;}
最壞時間複雜度:
最壞的情況是指每次區間劃分的結果都是以基準關鍵字左邊或者右邊的基準為空,也就是說原始待排序的序列本身就是有序的。這樣的話,需要進行(n-1)次區間劃分,對於k(0最好的時間複雜度:平均時間複雜度:最好的情況是指每次區間的劃分的結果都是基準關鍵字左右兩邊序列相同或者僅僅只是相差1,也就是說每次取出的基準都是出於中間值,此時需要進行比較的次數就是nlogn,所以快速排序最好情況下的時間複雜度是o(nlogn)。
快速排序的平均時間複雜度為o(nlogn),是不是感覺很奇怪?為什麼平均時間複雜度為什麼不是取最壞情況下的時間複雜度?這也就是你需要注意的地方。你需要知道的–:
雖然快速排序在最壞情況下的時間複雜度是o(n^2),但是在所有平均時間複雜度為o(nlogn)的排序演算法中,快速排序的平均效能是最好的。在下面的部落格中,我還會寫一篇關於希爾排序和堆排序的概述,其實原本不準備寫的,因為估計到面試應該並不會考察這種冷門知識,但是想著讓的我排序專題善終,還是寫一下,最後還會有乙個關於大部分排序演算法的時間和空間複雜度的乙個整理,所以,我們再會!
遞迴 快速排序 快速排序
問題描述 用遞迴來實現快速排序 quick sort 演算法。快速排序演算法的基本思路是 假設要對乙個陣列a進行排序,且a 0 x。首先對陣列中的元素進行調整,使x放在正確的位置上。同時,所有比x小的數都位於它的左邊,所有比x大的數都位於它的右邊。然後對於左 右兩段區域,遞迴地呼叫快速排序演算法來進...
排序 快速排序
快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...
排序 快速排序
定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...