快速排序

C++ 同时被 2 个专栏收录
14 篇文章 2 订阅

快排是最快的算法之一,主要使用了分治策略。

思路

第一步,将待排序序列 a 分成两部分 b c ,其中 b 部分的每个元素小于等于 c 部分中的所有元素。第二步,递归的使用相同程序处理序列 b c


这里写图片描述
图1 Quicksort(n)

步骤一具体做法,先选择一个元素 x ,所有小于 x 的元素放到第一部分 b 中,所有大于 x 的元素放到第二部分 c 中,等于 x 的元素放到哪边都可以。下面的算法中,对于等于 x 的元素,被放到任何一个部分都有可能。

partition算法

  • 版本一

输入:序列 a0,...,an1
输出:序列的一个置换,其中 a0,...,aj 小于等于 ai,...,an1 ( i>j )
算法:

    x=a[(n-1)/2]
    i = 0 and j = n-1
    while i<=j:
        搜寻第一个大于等于 x 的元素 a[i]
        搜寻最后一个小于等于 x 的元素 a[j]
        if i<=j:
            exchange(a[i],a[j])
            i=i+1 and j = j-1

注意这个版本的 partition 并不一定能把 x 放到它的最终位置。因为元素x也参与了交换。如果想得到 x 的最终位置,算法如下。

  • 版本二

输入:序列 a0,...,an1
输出:序列的一个置换和枢轴的位置,其中 a0,...,aj1ajaj+1,...,an1
算法:

    x=a[0]
    i = 1 and j = n-1
    while true:
        搜寻第一个大于等于 x 的元素 a[i]
        搜寻最后一个小于等于 x 的元素 a[j]
        if i>=j: 
            break
        exchange(a[i],a[j])
        i=i+1 and j = j-1
    exchange(a[0], a[j])
    return j;

C语言代码

  • 版本一:
void exchange(int a[], int i, int j){
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
void quickSort(int a[], int lo, int hi){
    if(lo >= hi) return;
    int x = a[lo+(hi-lo)/2];
    int i = lo, j = hi;
    // partition
    while(i <= j){
        while(a[i] < x)++i;
        while(x < a[j])--j;
        if (i <= j){
            exchange(a, i++, j--);
        }
    }
    // recursion
    quickSort(a, lo, j);
    quickSort(a, i, hi);
}
  • 版本二
    这里给一个 partition 版本的代码
int partition(int a[], int lo, int hi){
    int i = lo, j = hi + 1;
    int x = a[lo];
    while(true){
        while(a[++i] < x) if(i == hi) break;
        while(x < a[--j]) if(j == lo) break;
        if(i >= j) break;
        exchange(a, i, j);
    }
    exchange(a, lo, j);
    return j;
}
void quickSort(int a[], int lo, int hi){
    if(lo <= hi) return;
    int j = partition(a, lo, hi);
    quickSort(a, lo, j - 1);
    quickSort(a, j + 1, hi);
}
  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值