排序——快速排序法

一、快速排序法概念

快速排序(Quick Sort)法是对冒泡排序的一种改进,其基本思想是:通过一遍排序将需要排序的数据划分成两部分,使其中一部分数据比另一部分数据小,然后再分别对这两部分数据继续进行这种排序,按此规则继续,直到每个部分为空或只含一个数时,整个快速排序结束。这是一种分治策略,将大批的数据逐步分解,可使用递归的方法编写程序,使程序更简洁。

二、算法描述

快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:
(1)从数列中挑出一个元素,称该元素为“基准”。
(2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
(3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列
排序。

下面以一组待排序的数据演示快速排序的过程,假设有8个需要排序的数据序列如下:
69,65,90,37,92,6,28,54
假设数组A中保存着这8个数据,其排序过程如图下图所示。

(1)在变量left中保存数组的最小序号0,在变量right中保存数组的最大序号7,在变量base中保存数组的第1个元素A[0]作为基准。如上图所示。

(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,原右侧序号);
}

 

三、快速排序法的实现

(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)运行结果

四、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

运行结果

转载于:https://my.oschina.net/wangande2014/blog/687564

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值