轉載請註明出處:http://blog.csdn.net/ljmingcom304/article/details/50351728
本文出自:【梁敬明的博客】
1.快速排序
快速排序就是選擇一個基準數,將比基準數大的元素和比基準數小的元素分別在基準數的左右側分割爲兩部分,然後從兩部分中分別選取新的基準數進行左右分割,以此類推最終得到有序數列爲爲止。
存在一個序列【7】【5】【9】【6】【8】,將其按照從小到大的順序進行排序。
第一次排序,選取序列的第一個元素7爲基準數,從右往左查找比基準數7小的元素,最後交換元素6和元素7的位置。
第二次排序,從左往右查找比7大的元素,最後交換元素9和元素7的位置。
第三次排序,從右往左查找比7小的元素,沒有找到元素,此時左右箭頭重合。
第四次排序,以基準數7爲中心,將序列分爲左右兩部分,左半部分以元素6爲基準數,右半部分以元素9爲基準數。
第五次排序,左右兩部分按照以上方法遞歸進行,直到使整個序列有序位置。
2.示例代碼
對一個長度爲N的序列由小到大進行排序,以0索引的元素爲基準數進行排序時從右往左將較小的數交換到基準元素的左端,從左往右將較大數交換到基準元素的右端,交換完畢後以基準元素爲界將序列切割爲左右兩部分,左右兩部分按照同樣的方式進行元素交換,最終序列會進行
public class QuickSort {
public static void main(String[] args) {
int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
QuickSort.sort(array);
System.out.println("排序後數組:" + Arrays.toString(array));
}
public static void sort(int[] a) {
quickSort(a, 0, a.length - 1);
}
private static void quickSort(int[] a, int left, int right) {
if (left < right) {// 左下標小於右下標防止數組越界
// 對數組進行分隔取出下次分割的基準數索引
int base = division(a, left, right);
System.err.println(base+"");
// 對基準數左邊的一組數進行遞歸切割
quickSort(a, left, base - 1);
// 對基準數右邊的一組數進行遞歸切割
quickSort(a, base + 1, right);
}
}
private static int division(int[] a, int left, int right) {
// 以最左端的數爲基準線
int base = a[left];
while (left < right) {
// 從右向左遍歷,找到比base小的數放到最左邊
while (left < right && a[right] >= base) {
right--;
}
a[left] = a[right];
// 從左向右遍歷,找到比base大的數放到最右邊
while (left < right && a[left] <= base) {
left++;
}
a[right] = a[left];
}
// 將base放到left位置
a[left] = base;
return left;
}
}
3.算法分析
時間複雜度:
以基準元素進行切割, 基準元素的左右元素個數越相近,執行效率越高,左右元素個數差值越大,執行效率越低。即排序的性能與序列的隨機性成正比。
快速排序的最好時間複雜度和平均時間複雜度爲
算法穩定性:
對於序列【2】【1】【1】,第一次遍歷基準元素【2】和最後一個元素【1】發生位置交換,原序列中兩個元素【1】的前後位置發生改變,因此快速排序是一種不穩定的排序算法。