數據結構和算法-13-快速排序

這篇來學習下快速排序,快速排序是對冒泡排序的一種改進算法。

 

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);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章