排序——快速排序法

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

运行结果