快速排序Java实现

快速排序Java实现

快速排序是相对其他排序效率高且简单的排序方,java.util.Arrays.sort方法也用快速排序的方法。快速排序算法也是相对于其他排序算法比较难理解的算法,但是掌握好方法也就不是那么难理解了。
算法设计思路:参考博客
快速排序算法需要找到一个基准值,本文中以数组最左边的元素作为基准值(即便这样会使算法对某些数组变得非常低效)。快速排序算法会把整个数组分成以基准值为基准的左右两部分,基准值左侧的元素都比基准值小,基准值右侧的元素都比基准值大,然后分别对左右两部分数字进行排序,排过序的左右两边的数组合并,那整个数组都自然就排好序了。按如下图所示进行:
在这里插入图片描述
理解方法: 我们假设在数组最左侧站着一个哨兵i,最右侧站着另一个哨兵j,哨兵j先出发从右到左寻找比基准值小的元素,找到后停止;哨兵i后走从左开始寻找比基准值大的元素,找到后停止;停止后哨兵i和哨兵j所站位置下的元素互换,依此类推直至基准值归位。基准值归位后对两部分数组在进行如上所示直至左右两边数组元素都排好序,整个算法也就完成了。

算法名称:快速排序
输入:未排序的a[ i ]数组,i >=0,i是自然数
输出:排好序的数组

快速排序算法伪代码:

public class QuickSort {
       public static void main(String[] args){
           int[] a = new int[]{3,4,2,6,5,7,6,7,8,9};
           quickSort(a,0,a.length-1);

           for (int i:a
                ) {
               System.out.print(i+" ");
           }
       }
    private static void quickSort(int[] a, int left, int right ) {
        if(left>right){//当左侧索引大于右侧索引时返回
            return;
        }

        int i = left;//让哨兵i站在最左侧
        int j = right;//让哨兵j站在最右侧
        int temp = a[left];//temp为基准值,先已最左侧数为基准值
        while(i < j){ //当哨兵i在哨兵左侧时(必须满足的条件)
            /*若哨兵j对应的数字大于等于基准值则哨兵j从右向左行进,
            当找到哨兵j对应的数字小于基准值时停止*/
            while (temp <= a[j]&&i < j) j--;
            /*若哨兵i对应的数字小于等于基准值则哨兵i从左向右行进,
            当找到哨兵i对应的数字大于基准值时停止*/
            while (temp >= a[i]&&i < j) i++;
            if (i < j) {//哨兵i一直在哨兵j的左侧
                /*基准值左侧大于基准值的数和基准值右边小于基准值的数交换*/
                int t = a[j];
                a[j] = a[i];
                a[i] = t;
               }
           }
           a[left] = a[i];//循环结束后新基准值为与i,j对应的数,即最后较合适的基准值
           a[i] = temp;//循环结束后i,j对应的数与原基准值交换
           quickSort(a,left,j-1);
           quickSort(a,j+1,right);
    }
}

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALIM MUSA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值