快速排序基本思想
在資料集之中,選擇乙個元素作為」基準」(pivot)。
所有小於」基準」的元素,都移到」基準」的左邊;所有大於」基準」的元素,都移到」基準」的右邊。這個操作稱為分割槽 (partition) 操作,分割槽操作結束後,基準元素所處的位置就是最終排序後它的位置。
對」基準」左邊和右邊的兩個子集,不斷重複第一步和第二步,直到所有子集只剩下乙個元素為止。
public class student {
//快速排序,是每次確定乙個元素最終位置,再對其左、其右進行排序
public static void quicksort(int arr,int low,int high)
{ if(low>=high) //注意一開始要判斷兩個下標
return;
int element=arr[low]; //將元素儲存起來
int i=low; //左指標
int j=high; //右指標
while(i=element) //注意是》=
當初始的序列整體或區域性有序時,快速排序的效能將會下降,此時,快速排序將退化成氣泡排序
一、時間複雜度
最壞時間複雜度o(n^2):每次劃分的結果都是基準關鍵字的左邊(或右邊)序列為空,而另一邊區間中的記錄僅比排序前少了一項
最好時間複雜度o(nlogn):每次劃分結果都是基準關鍵字左右兩邊的序列相等或相差1
平均複雜度o(nlogn)
二、空間複雜度
快速排序過程中需要乙個棧空間來實現遞迴
o(logn)
三、基準關鍵字的選取
基準關鍵字的選取是決定快速排序演算法效能的關鍵
①三者取中(low、mid、high)
②取隨機數( low high 隨機數)
四、不穩定排序
在中樞元素和序列中乙個元素交換的時候,很有可能把前面的元素的穩定性打亂。
還是看乙個小例項:6 4 4 5 4 7 8 9,第一趟排序,中樞元素6和第三個4交換就會把元素4的原序列破壞,所以快速排序不穩定。
排序演算法(五) 快速排序
在陣列中選取乙個數作為基準值,進行乙個partition過程,將小於該數的放在左邊,大於的放在右邊,等於的放在中間,再對左右分別進行該操作。時間複雜度 每次partition可以將乙個數字位置確定,將陣列劃分為兩部分,因此想要有序,理想情況每次剛好兩邊大小一樣,則一共需要logn次partition...
排序演算法(五) 快速排序
快速排序是一種效率很高的排序演算法,也是我們使用最多的一種排序演算法。快速排序原理 兩個指標分別指向陣列兩頭元素,將陣列第乙個元素儲存下來,作為基準數,兩個指標開始向中間移動,先移動陣列尾部指標,直到發現所指元素比基準數小時,將這時候所指向的數賦值給陣列頭部指標指向的位置,然後尾部指標停止移動,頭部...
排序演算法五 快速排序
取陣列最中間的那個數為基數 取哪乙個數為基數都可以,取中間的只是為了好理解 在左邊找乙個比基數大的數,在右邊找乙個比基數小的數,如果找到就交換兩個數的位置,交換過後再向下尋找,直到左邊的角標大於等於右邊則退出,一輪排序後,基數的左邊一定都是比基數小的,基數的右邊一定是比基數大的,注意 基數不一定還在...