這篇來學習下快速排序,快速排序是對冒泡排序的一種改進算法。
1.快速排序定義
快速排序(QuickSort),又稱劃分交換排序,通過一趟排序將要排序的數據分割成獨立的兩部分。其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按照此方法對兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
2.快速排序思想和圖解
快速排序步驟爲:
1.從數列中挑出一個元素,稱爲"基準"。
2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準大的擺放在基準的後面,相同的可以擺到任意一邊。在這個分區結束之後,該基準就處於數列的中間位置。這個稱爲分區(partition)操作。
3.遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞歸的最底部情形,是數列的大小是0或者1,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個算法總會結束,因爲在每次迭代中,它至少會把一個元素擺放到它最後面的位置去。
3.快速排序的代碼實現
python代碼的實現
# encoding:utf-8
def quick_sort(alist, first, last):
"""快速排序"""
if first >= last:
return
mid_value = alist[first]
low = first
high = last
while low < high:
# 基準值和high對應值比較,high左移
while low < high and alist[high] >= mid_value:
# 說明high對應元素大於中間基準值,high需要往左移動
high -= 1
# 退出循環,把high和low對應元素進行位置交換
alist[low] = alist[high]
# 基準值和low對應的值比較, low右移
while low < high and alist[low] < mid_value:
low += 1
# 退出循環,
alist[high] = alist[low]
# 從循環退出時,low==high
alist[low] = mid_value
# 對low左邊列表執行快速排序,遞歸調用
# 對low左邊列表執行快速排序,遞歸調用
quick_sort(alist, first, low-1)
# 對low右邊列表進行排序
quick_sort(alist, low+1, last)
if __name__ == "__main__":
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(li)
quick_sort(li, 0, len(li)-1)
print(li)
運行結果
[54, 26, 93, 17, 77, 31, 44, 55, 20]
[17, 20, 26, 31, 44, 54, 55, 77, 93]
Java代碼的實現
package com.anthony.sort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {54, 26, 93, 17, 77, 31, 44, 55, 20};
System.out.println(Arrays.toString(arr));
quickSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int first, int last) {
if (first >= last){
return ;
}
int mid_value = arr[first];
int low = first;
int high = last;
while ( low < high) {
// 基準值和high對應值比較,high左移
while ( low < high && arr[high] >= mid_value) {
// 說明high對應元素大於中間基準值,high需要往左移動
high -= 1;
}
// 退出循環,把high和low對應元素進行位置交換
int tmp = arr[low];
arr[low] = arr[high];
arr[high] = tmp;
// 基準值和low對應的值比較, low右移
while ( low < high && arr[low] < mid_value) {
low += 1;
}
// 退出循環,
int tmp1 = arr[high];
arr[high] = arr[low];
arr[low] = tmp1;
}
// 從循環退出時,low==high
arr[low] = mid_value;
// 對low左邊列表執行快速排序,遞歸調用
quickSort(arr, first, low-1);
// 對low右邊列表進行排序
quickSort(arr, low+1, last);
}
}