排序——快速排序法

1、快速排序法概念python

快速排序(Quick Sort)法是對冒泡排序的一種改進,其基本思想是:經過一遍排序將須要排序的數據劃分紅兩部分,使其中一部分數據比另外一部分數據小,而後再分別對這兩部分數據繼續進行這種排序,按此規則繼續,直到每一個部分爲空或只含一個數時,整個快速排序結束。這是一種分治策略,將大批的數據逐步分解,可以使用遞歸的方法編寫程序,使程序更簡潔。算法

2、算法描述數組

快速排序使用分治策略來把待排序數據序列分爲兩個子序列,具體步驟爲:
(1)從數列中挑出一個元素,稱該元素爲「基準」。
(2)掃描一遍數列,將全部比「基準」小的元素排在基準前面,全部比「基準」大的元素排在基準後面。
(3)經過遞歸,將各子序列劃分爲更小的序列,直到把小於基準值元素的子數列和大於基準值元素的子數列
排序。

下面以一組待排序的數據演示快速排序的過程,假設有8個須要排序的數據序列以下:
69,65,90,37,92,6,28,54
假設數組A中保存着這8個數據,其排序過程如圖下圖所示。app

(1)在變量left中保存數組的最小序號0,在變量right中保存數組的最大序號7,在變量base中保存數組的第1個元素A[0]做爲基準。如上圖所示。less

(2)從數組右側開始,逐個取出元素與base比較,直到找到比base小的數據爲止。在本例中,數組最右側的元素A[right]的值54就比base變量中保存的值69小。
(3)將右側比基準base小的數(數組元素A[right]中的數)保存到A[left](A[0])元素中。
(4)接下來,從數組左側開始,逐個取出元素與base比較,直到找到比base大的數據爲止。在本例中,數組最左側的元素A[left](即A[0])的值爲54,比base的值小,將left自增1(值爲1)。再取A[left](A[1])的值65與base的值69比較,65<69,繼續將left自增1(值爲2)。再取A[left](A[2])的值90與base比較,因90>69,結束查找。
(5)將左側比基準base大的數(數組元素A[2])保存到A[right](A[7])元素中。
(6)將base中的值保存到A[left](A[2])中。通過這些運算,獲得如圖4-6b所示的效果。
提示 通過這一次分割,base數據左側(也就是left所指向的數據)的數比base小,而base數據右側的數比base大。
(7)接下來,經過遞歸調用,將left左側的數據進行一樣的排序,再將left右側的數據進行一樣的排序。測試

通過這樣的遞歸調用,最終可將數據完成排序操做。
從前面的分析可知,快速排序是一個遞歸過程,其算法描述以下:
void快速排序(數組,左側序號,右側序號)
{
    分割數據,將left保存到i
    快速排序(數組,原左側序號,i-1);
    快速排序(數組,i+1,原右側序號);
}ui

 

3、快速排序法的實現code

(1)快速排序法 排序

int Division(int a[], int left, int right)
{
    int base = a[left];

    while (left < right) {
        while (left<right && a[right]>base) 
            --right;
        a[left] = a[right];

        while (left<right && a[left]<base)
            ++left;
        a[right] = a[left];
    }

    a[left] = base;

    return left;
}

void QuickSort(int a[], int left, int right)
{
    int i, j;
    if (left<right) {
        i = Division(a, left, right);
        QuickSort(a, left, i-1);
        QuickSort(a, i+1, right);
    }

}

(2)數組顯示遞歸

void ShowData(int arr[], int n)
{
    int i;
    for (i=0; i<n; i++)
        printf("%d ", arr[i]);
    printf("\n");

    return;
}

(3)測試

#define ARRAYLEN 10

int main(int argc, char *argv[])
{
    int i;
    int a[ARRAYLEN] = {94, 84, 54, 80, 62, 83, 37, 24, 67, 29};

    printf("原數據:");
    ShowData(a, ARRAYLEN);

    QuickSort(a, 0, ARRAYLEN-1);
    printf("排序後:");
    ShowData(a, ARRAYLEN);
    return 0;

}

(4)運行結果

4、python實現快速排序法

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def quicksort(array):
    less = []
    greater = []
    if len(array) <= 1:
        return array
    
    pivot = array.pop()
    for x in array:
        if x <= pivot:
            less.append(x)
        else:
            greater.append(x)
    
    return quicksort(less) + [pivot] + quicksort(greater)

if __name__ == "__main__":
    array = [94, 84, 54, 80, 62, 83, 37, 24, 67, 29]
    print "原數據:", array
    sort_array = quicksort(array)
    print "排序後:", sort_array

運行結果

相關文章
相關標籤/搜索