快排

本文介绍了快速排序算法的工作原理,它是冒泡排序的一种优化。通过选取基准数,利用两个哨兵i和j分别从数组两端扫描,找到合适的位置交换元素,确保基准数归位。递归地对基准数左右两部分进行相同操作,直到所有元素排序完成。提供的Java代码展示了快速排序的实现过程。

原理

快排就是快速排序嘛,是冒泡排序的优化.
冒泡是每一轮相邻两两元素比较,然后交换,直到最后一轮,结束.
快排的话,就是找数组最左边的元素作为一个基准数,然后经过两边的元素跟基准数作比较再交换后,基准数左边都是比基准数小的数,右边都是比基准数大的数.然后以基准数为界将数组分为两部分,此时基准数已经归位.
然后这两部分再执行上面的操作,所有的基准点都归位.
就是比如数组0号位置,和arr.length-1号位,有两个哨兵i和j,
哨兵i对应在0号索引位,哨兵j在最后一个元素的索引位(arr.length-1),
还有一个基准数用来做给哨兵i和哨兵j做参照的.基准数为数组第一位(0号索引位的元素),
然后右边的哨兵j先开始向左移动,找比基准数小的数,找到停下来,然后左边的哨兵i向右移动,找到比基准数大的数,停下来,然后i和j找到的数相互交换,都找完都进行交换,直到哨兵i和哨兵j相遇.然后基准数和他两相遇的数进行交换,这个基准数就归位了,基准数左边都是比他小的数,右边都是比他大的数,然后基准值左边的这部分我们暂且叫做数组a,右边的叫做数组b,
a和b都进行上面的操作,直到所有基准都归位.

代码

package arithmetic;

        import java.util.Arrays;

/**
 * @author :xiaotao
 * @date :2021/3/6 0:14
 * @description: 快速排序
 */
public class QuickSort {
    public static void main(String[] args) {

        int[] arr = {8, 1, 6, 4, 11, 22, 5};

        quicklySort(arr, 0, arr.length - 1);

        System.out.println(Arrays.toString(arr));
    }

    public static void quicklySort(int[] arr, int i, int j) {
        if (i > j) {
            return;
        }

        int low = i;
        int high = j;

        //定义一个基准值
        int base = arr[low];

        while (i < j) {
            while (arr[j] >= base && i < j) {
                j--;
            }
            while (arr[i] <= base && i < j) {
                i++;
            }

            //i找到比基准大的数,j找到比基准小的数,i和j交换数字
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //当i和j相遇了,然后相遇时的数字跟基准值交换.
        arr[low] = arr[i];
        arr[i] = base;
        //然后以i和j相遇后跟基准值交换后的位置作为分界点,将数组分成两部分,
        //分界点左边的都比基准值小,右边的都比基准值大,
        //然后递归,每部分都去执行上面的步骤,直到全部排完.递归结束.
        quicklySort(arr, 0, j - 1);
        quicklySort(arr, j + 1, high);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值