快速排序——分治

  1. 确定分界点:q[l], q[ (l+r)/2], q[r], 随机
  2. 调整区间,使得第一个区间里的所有数都小于等于x,第二个区间里的所有数都大于等于x
  3. 递归处理左右两段区间

    调整区间的两种方法:

一、暴力法

  • 先申请两块内存区间,a[ ], b[ ];
  • 对待排数组q[l~r]分别找出比x小的数,存放在a[ ]中,比x大的数存放在b[ ]中;
  • 把a[ ]中的数放进q[ ]中,b[ ]中的数放进q[ ]中

二、优雅的算法

  • 首先定义两个指针i和j分别指向最左端和最右端;
  • i先依次往后寻找小于x的数,若该数大于等于x,则j往左依次寻找大于x的数,若到某数小于等于x,则j停下,交换i和j所指向的数的位置,指针i和指针j分别往前移动一位,i继续依次往后寻找...
  • 重复以上步骤,直到i和j相遇同时指向同一个位置并再往后走一次
  • 从而发现j指针在i指针的前面,而j指针前面的数(包括j指针的位置)都小于等于x,i指针后面的数(包括i指针的位置)都大于等于x

 三、关键代码

public static void quick_sort(int q[], int l, int r) {
        if (l >= r)
            return;
        int x = q[l];
        int i = l - 1, j = r + 1;
        while (i < j) {
            do {
                i++;
            } while (q[i] < x);
            do {
                j--;
            } while (q[j] > x);
            if (i < j) {          //也可写一个swap()交换函数
                int t = q[i];
                q[i] = q[j];
                q[j] = t;
            }
        }                        //以j值作为分界点
        quick_sort(q, l, j);     //递归左段进行排序
        quick_sort(q, j + 1, r); //递归右端进行排序
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值