同步更新。歡迎移步體驗更好的閱讀效果。
快速排序通過將乙個陣列劃分成兩個子陣列, 然後通過遞迴呼叫自身為每乙個子陣列進行快速排序來實現.
設定關鍵字(基準數), 將比關鍵字小的放在一組, 比關鍵字大的放在另一組.
下面將以陣列[6,1,2,7,9,3,4,5,10,8]為例, 演示排序過程
先把陣列中的乙個數當做基準數, 一般會把陣列中最左邊的數當做基準數, 然後從兩邊進行檢索. 先從陣列的右邊檢索比基準數小的, 再從左邊檢索比基準數大的. 如果檢索到了, 就停下, 然後交換這兩個元素, 然後再繼續檢索.
i和j一旦相遇, 就停止檢索, 把基準數和相遇位置的元素交換
基準數和相遇位置的元素交換完成後, 表示第一輪排序結束, 此時陣列的特點: 基準數左邊的元素都比它小, 右邊的元素都比它大.
接下來, 先排基準數左邊的陣列, 排完之後再排基準數右邊的陣列, 方式和第一輪一樣, 整個過程如下圖
最壞:o(n^2)
平均: o(nlogn)
不穩定, 比如序列為 (5, 3, 3, 4, 3, 8, 9, 10, 11), 第一輪中, 基準數5和第5位置的3交換, 就會破壞穩定性
public
class
quicksort
// i 從左往右檢索
while
(arr[i]
<= base && i < j)
// i停下了, j也停下, 交換兩個位置的元素
int temp = arr[i]
; arr[i]
= arr[j]
; arr[j]
= temp;
}// 如果i和j相遇了, 就交換基準數和相遇位置的元素
arr[left]
= arr[i]
; arr[i]
= base;
// 基準數在這裡就歸位了, 左邊的數字都比它小, 右邊的數字都比它大.
// 排基準數左邊的陣列
quicksort
(arr, left, i -1)
;// 排基準數右邊的陣列
quicksort
(arr, j +
1, right);}
public
static
void
main
(string[
] args)
;quicksort
(arr,
0, arr.length -1)
; system.out.
println
(arrays.
tostring
(arr));
}}
int partition(int l, int low, int high)//對子表進行一趟排序,返回樞軸位置
l[low] = l[0];
return low;
}void qsort(int l, int low, int high)
}
如果l[0]上面有數字(不閒置),稍微改動一下就可以了
int patition(int l, int low, int high)
l[low] = temp;
return low;
}void qsort(int l, int low, int high)
}
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
演算法設計 快速排序 隨機快速排序演算法
1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...