快排算法

快排的基本思路为先确定出一个基准数(取第一个数为基准数),然后通过与基准数循环比较的方法,将所有比基准数小的数字放在它的左边,所有比它大的数字放在右边,实现一部分数字都比另一部分小。然后再通过此方法对这两部分数据分别进行相同的操作,整个过程可以通过递归实现,最后对所有数字进行排序。
代码演示如下:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        //定义一个数组,使用快排进行排序
        int[] arr = {10, 5, 78, 45, 33, 98, 67, 19, 4, 99, 46};
        //调用快排的方法,参数为数组,数组的第一个索引,数组的最后一个索引
        quiteSort(arr, 0, arr.length - 1);
        //打印数组
        System.out.println(Arrays.toString(arr));
    }

    //快排的方法
    private static void quiteSort(int[] arr, int left, int right) {

        //递归结束的条件
        if(left > right){
            //结束这个方法
            return;
        }

        //记录第一个元素的索引位置
        int left0 = left;
        //记录最后一个元素的索引位置
        int right0 = right;
        //将第一个元素设置为基准数
        int baseNumber = arr[left];

        //如果左边不等于右边则循环比较
        while (left != right){

            //先比较数组右边的元素,如果右边的元素不小于基准数,则right向前移动
            //直到小于基准数时结束循环,同时要保证左边索引小于右边索引
            while(arr[right] >= baseNumber && left < right){
                right--;
            }

            //再比较数组左边的元素,如果左边的元素不大于基准数,则left向后移动
            //直到大于基准数时结束循环,同时要保证左边索引大于右边索引
            while (arr[left] <= baseNumber && left < right){
                left++;
            }

            //交换元素,小的放左边,大的放右边
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }

        //当循环结束后,左边索引等于右边索引,此时进行基准数归位
        //所有比基准数大的都在右边,比基准数小的都在左边,
        int temp = arr[left];
        arr[left] = baseNumber;
        arr[left0] = temp;

        //递归左边调用该方法进行排序,传入参数该数组,数组的第一个索引,数组左边最后一个索引
        //将基准数左边的元素排序
        quiteSort(arr, left0, left - 1);
        //递归右边调用该方法进行排序,传入参数该数组,数组右边第一个索引,数组最后一个索引
        //将基准数右边的元素排序
        quiteSort(arr,  right + 1, right0);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值