2.快速排序

2.快速排序


前言

快速排序可以说是所有排序算法里最常用、最优秀、最效率的算法。它是冒泡排序的改进版。就像它的名字一样,“快速”!


实现思路

实现思路是非常有趣的:
- 1.先一个基准数(一般选择第一个数。即,index = 0)。
- 2.来个while,从数组最右边开始找比基准数小的数,记录下标为 r。
- 3.在再来个while,从数组最左边开始找比基准数大的数,记录下边为l。
- 4.交换两个数的位置。即下标 r 和下标 l 的数交换。
- 5.当找到r == l 的时候。即,相遇的时候,第一次排序已经完成。此时,必然走到数组的中间的数。
- 6.基准数(index = 0)和 中间数交换。
- 7.此时原来的基准数到了中间,根据原来的基准数切分为两个数组(都不包含原基准素)。
- 8.分别给两个数组做 上诉 1-7 的操作(开始递归)。


实现代码

    public <T extends Comparable<T>> void quickSorting(T[] array, int left, int right) {
        int r, l;
        if (left > right) return;
        // 基准数
        T temp = array[left];
        l = left;
        r = right;
        while (l != r) {
            /**
             * 要先从右往左找
             * 如果比基准数大,就一直找下去,直到找到比基准数小的
             */
            while ((array[r].compareTo(temp) >= 0) && l < r) r--;
            /**
             * 要先从左往右找
             * 如果比基准数小,就一直找下去,直到找到比基准数大的
             */
            while ((array[l].compareTo(temp) <= 0) && l < r) l++;
            if (l < r) {
                /**
                 * 交换
                 */
                T t = array[l];
                array[l] = array[r];
                array[r] = t;
            }
        }
        /**
         * 基准数与中间位置的数字交换
         */
        array[left] = array[l];
        array[l] = temp;
        /**
         * 继续处理左边的,这里是一个递归的过程
         */
        quickSorting(array, left, l - 1);
        /**
         * 继续处理右边的,这里是一个递归的过程
         */
        quickSorting(array, l + 1, right);
    }

运行

    public static void main(String args[]) {
        Integer[] object = {26, 19, 7, 37, 27, 57, 67, 99, 87, 17};
        QuickSort quickSorting = new QuickSort();
        quickSorting.quickSorting(object, 0, object.length - 1);
        System.out.println("\n快速排序\n");
        for (int i : object) {
            System.out.print(i + " ");
        }
    } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值