八大排序算法之快速排序—Java

快排

快速排序是对冒泡排序的一种改进。
基本思想:随意找一个中间值,通过一趟排序将要排序的数据分割成独立的两部分,左边的所有数据要比中间的小,右边的所有数据要比中间的大,然后再按照此方法对两边的数据进行递归,以此达到排序的目的。
假设我们对8 5 25 11 23 15进行排序将15作为中间点,
第一次操作后8 5 11 15 23 25
之后对将数组分为左右两部分,左边 8 5 11 右边23 25
分别对两边递归操作直至排序结束
代码如下:

public class QuickSortDemo {
    public static void main(String[] args) {
        int[] array = {8,5,25,11,23,15};
        quickSort(array, 0, array.length -1);
        System.out.println("排序后的结果");
        System.out.println(Arrays.toString(array));
    }
    public static void quickSort(int[] arr,int low,int high){
        if(low < high){
            //先划分
            int position = partition(arr,low,high);
            //左递归
            quickSort(arr,low,position - 1);
            //右递归
            quickSort(arr,position + 1,high);
        }
    }

    /**
     * 
     * @param arr 代排序数组
     * @param low 左侧索引
     * @param high 右侧索引
     * @return
     */
    public static int partition(int[] arr,int low,int high){
        int midVal = arr[high];//以最后一个元素为中心元素
        //左指针
        int leftPoint = low;
        for (int i = low; i < high; i++) {
            if(arr[i] <= midVal){
                int temp = arr[i];
                arr[i] = arr[leftPoint];
                arr[leftPoint] = temp;
                leftPoint++;
                System.out.println(Arrays.toString(arr));
            }
        }
        int temp = arr[leftPoint];
        arr[leftPoint] = arr[high];
        arr[high] = temp;
        return leftPoint;
    }
}

其中partition函数至关重要,这里解释一下,我们使arr[high]为中心元素,主要借助左指针leftPoint进行定位。
以[8, 5, 25, 11, 23, 15]为例子,其中low = 0,high = 5
搜先让左指针指向low,以第二个指针i对列表依次遍历
i = 0时发现8 <= 15 ,那么leftPoint与i指针对应的值进行替换,此处是原地替换,此时已经确定arr[leftPoint] <= 15了,就leftPoint++ 此时列表仍为[8, 5, 25, 11, 23, 15]
i = 1 时 同上 5 <= 15,原地替换 leftPoint++ 此时列表仍为[8, 5, 25, 11, 23, 15]
i = 2 时 25 > 15不操作 leftPoint仍为2 此时列表仍为[8, 5, 25, 11, 23, 15]
i = 3时 11 <= 15 leftPoint与i指针对应的值进行替换 ,此时列表仍为[8, 5, 11, 25, 23, 15],lefPoint++为3
i = 4 时23 > 15不操作 lefPoint++仍为3 此时列表仍为[8, 5, 11, 25, 23, 15]
循环结束,此时lefPoint左侧均小于等于15,右侧除最后一个元素均大于15
将lefPoint对应的元素与最后一个元素替换[8, 5, 11, 15, 23, 25]返回lefPoint即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值