如何写出正确的快速排序

首先先了解快排的几个步骤:

  1. 快排需要一个临界点

  2. 基于临界点,将数组分割成左右两部分,左边的数据小于临界点,右边的数据大于临界点

  3. 将左右两边的数据可以看做一个分割的数组,重复步骤1,2,直到数组分割的数组不符合常规数组(数组低位索引大于的等于高位索引)

图解快排,假如有一组整数数组 int[] a = {5,2,6,4,8,7.0,9,1,3};  注:这里我选择数组的下标最小值为临界点,图片红色代表有序的数据,字体加粗代表分割要排序的数组。

1.数组初始值,5位临界点

2.第一轮获取临界点5排序后所在数组的索引值是5,左边加粗的数据小于5,下轮进行排序,下轮临界点为2

3.第二轮获取临界点2排序后所在数组的索引值是2,左边加粗的数据小于2,下轮进行排序,下轮临界点为2

4.第三轮获取临界点为0,排序后所在数组的索引值为2,左边没数据,下轮对0右边的数据进行排序,下轮临界点为1,下轮数据只有一个,是1

5.第四轮获取临界点为1,排序后所在数组据的索引值为1,左右两边没数据,下轮对4,3进行排序,下轮临界点为4

后面的描述就不重复了,我这里直接上图了

代码实现

package com.algorithms.sort;

public class QuickSort {



    public static void sort(int[] a){
        sort(a,0,a.length-1);
    }

    private static void sort(int[] a, int low, int height){
        if(low >= height){
            return;
        }
        int j = partition(a,low,height);
        sort(a,low,j-1);
        sort(a,j+1,height);

    }

    /**
     * 将数组low-height之间区确定a[low]在数组中的位置并返回索引值
     * @param a
     * @param low
     * @param height
     * @return 返回数组固定顺序的索引值
     */
    private static int partition(int[] a, int low, int height) {
        //需要确定位置的数据,临界值
        int v = a[low];
        //索引开头
        int i = low;
        //需要确定位置的数据初始索引
        int index = low;
        //遍历比较数据
        while (true){
            //比较数据比要比较的数据小,将数据放到索引位置,索引位置+1
            if(a[++i] < v){
                a[index++] = a[i];
                //游标,比临界值大的数据往后以
                int cursor = i;
                //游标值大于索引值,数组后移动
                while (index < cursor){//
                    a[cursor] = a[--cursor];
                }
            }
            //返回跳出
            if(i == height) {
                a[index] = v;
                return index ;
            }
        }
    }

}

创作不易,您的支持是我最大的动力。请支持一下或关注一下

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值