怎样理解快速排序

一.原理

快速排序:干说原理

  1. 先从数组中选出一个值,作为权重temp,然后从数组最右边high(其中一边都行)开始,向左边遍历(记最左边为low)
  2. 如果arr[high]比temp大,那么不管,high继续向左移动
  3. 如果arr[high]比temp小,那么此时
  4. arr[low] = arr[high]
  5. 当找到第一个赋值的地方的时候,不在继续high--;这个时候从左边开始
  6. 如果arr[low]比temp小,不管,low++
  7. 如果arr[low] 大于temp,那么第二次交换
  8. arr[high] = arr[low]
  9. 这时暂停low++,又需要回到high--.
  10. 如此交替,直到high和low重合:
  11. 这时high=low
  12. arr[low] = temp;

完成第一轮分组,把比temp大的数放到了右边,比temp小的数放到了左边.

再以刚刚的low为分界,递归调用,直到所有元素都满足小的在左边,大的在右边,完成排序

二.图解

干说太干,我们用图来理解

我们选择第一个元素为权重,从右边开始

接着以43为分界,前边从index=0到43的位置,递归此方法,后边亦如此.

java代码

package sort.quick;

import java.util.Arrays;

/**
 * @description: 快速排序
 * @author:tao
 * @create: 2019-12-28 11:18
 */
public class QuickSort {

    public static void main(String[] args) {
        int []array = {5, 8, 6, 3, 9, 2, 1, 7};
        System.out.println("原数组:" + Arrays.toString(array));
        quickSort(array, 0, array.length - 1);


        System.out.println("排序数组:" + Arrays.toString(array));
    }

    private static void quickSort(int[] array, int low, int high) {
        if (low < high) {
            int index = getEqualIndex(array, low, high);
            quickSort(array, low, index - 1);
            quickSort(array, index + 1, high);
        }

    }

    private static int getEqualIndex(int[] array, int low, int high) {
        int temp = array[low];
        while (low < high) {
            // 后往前
            while (low < high && temp <= array[high]) {
                high--;
            }
            // 交换(temp 比最后大)
            array[low] = array[high];
            while (low < high && temp >= array[low]) {
                low ++;
            }
            array[high] = array[low];
        }
        array[high] = temp;
        return high;
    }


}

原数组:[43, 22, 49, 6, 5, 2, 50, 65]
排序数组:[2, 5, 6, 22, 43, 49, 50, 65]
交换次数=14

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值