java :快速排序

##java快速排序
快速排序(挖坑and分治)
采用分治法;

  • 1.找到一个基准值,即比对的标杆,一般以数组的第一个元素开始
  • 2.数组从前到后,从后到前,以基准值为比较对象,把大于基准值的数放基准值的右侧,把小于基准值的数放它的左侧,达到分两份的效果
  • 3.不断重复2,即递归,直到区间里为一个数的时候
    示例:
    0—1---2—3---4—5---6
    2—3---9—2---1—4---5
    第一次以a[0] =2作为基准值,把a[0]处挖坑,i=0,j=a.length-1,分别为从前向后,从后向前的指针;
    从后向前,a[6]>2,不动,a[5]>2,不动,a[4]<2,将a[4]放入坑中,a[4]处挖坑;
    0—1---2—3---4—5---6
    1—3---9—2---1—4---5
    第二次,基准值仍为2,此时从前向后比对,a[0]<2不动继续,a[1]>2,将a[1]放到刚才挖的坑处,即a[4]=a[1],再在a[1]处挖坑
    0—1---2—3---4—5---6
    1—3—9---2—3---4—5
    第三次,基准值仍为2,此时从后向前比对,a[3]=2,将a[3]放入坑中,即a[1]=a[3],等于标准值的时候,两个方向指针要选中处理一个方向,此时在a[3]处挖坑
    0—1---2—3---4—5---6
    1—2---9—2—3---4—5
    第四次,基准值仍为2,此时从前向后比对,a[2]>2,将a[2]放入坑中,即a[3]=a[2],在a[2]处挖坑
    0—1---2—3---4—5---6
    1—2---2—9---3—4---5
    第三次,基准值仍为2,此时的前后指针指向同一个位置 i=j,把基准值放入坑中
    0—1---2—3---4—5---6
    1—2---2—9---3—4---5
    可以看出以a[2]为基准,左右分割为两部分,左边比2小,右边比2大,
    然后分两部分递归,分别从01,36;

代码


    public static void quickSort(int[] data, int l, int r) {
        if (l >= r) {
            return;
        }
        int low = l;
        int high = r;
        int key = data[low];
        while (low < high) {
            for (; ; high--) {
                if (low >= high) {
                    break;
                }
                if (data[high] < key) {
                    data[low] = data[high];
                    break;
                }
            }
            for (; ; low++) {
                if (low >= high) {
                    break;
                }
                if (data[low] > key) {
                    data[high] = data[low];
                    break;
                }
            }
        }
        if (low == high) {
            data[low] = key;
        }
        quickSort(data, l, low - 1);
        quickSort(data, high + 1, r);
    }

    /* 主函数*/
    public static void main(String[] args) {
        int[] data = {1, 11, 9, 9, 9, 2, 3, 2, 3, 1, 4, 2, 2, 2};
        quickSort(data, 0, data.length - 1);
        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i] + " ,");
        }
    }

小结

  • 1.写函数,第一步进来,一定要先判断参数,数组的话:
    data==null | data.length> 0 、 l < r

  • 2.递归的时候,要在循环之外,且要有停止递归的条件,如这里的 l < r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值