快速排列

快速排列思想:

  1. 把数组中最左边数当作基准数,然后从两边进行检索
  2. 先从右边检索(与基准数反方向)比基准数小的,再从左边检索比基准数大的
  3. 如果检索到了就停下,然后交换这两个元素,然后继续检索
  4. 当左边索引与右边索引检索到同一个值时,交换基准数与该位置的值
  5. 基准数和相遇位置的数交换完成,表示第一轮排序结束,此时基准数左边的值都比他小,右边都比他大
  6. 以后先排基准数左边,排完后再排右边,方式和第一轮一样
import java.util.Random;

public class QuickSort {
    public static void main(String[] args) {
//        //定义数组
//        int[] arr = {1,10,6,3,7,9,5,4,8};
//        //调用方法,进行快速排列
//        quickSort(arr,0,arr.length-1);
//
//
//        //遍历数
//        for (int i = 0;i<arr.length;i++){
//            System.out.print(arr[i]);
//        }

        //定义一个数组
        int[] arr = new int[10000000];
        Random r = new Random();
        //给数组元素赋值
        for (int i=0;i<arr.length;i++){
            //生成随机数
            int num = r.nextInt();
            arr[i] = num;
        }

        //排序之前记录时间
        long strat = System.currentTimeMillis();
        //排序
        quickSort(arr,0, arr.length-1);
        //排序之后记录时间
        long end = System.currentTimeMillis();
        System.out.println(end - strat);
    }

    /*
     * 定义方法,用来进行快速排列
     * left左边索引位,right右边索引位
     */
    public static void quickSort(int[] arr,int left,int right){
        //进行判断,如果左边索引比右边索引要大,是不合法的,直接用return结束这个方法
        if (left>right){
            return;
        }
        //定义变量保存基准数
        int base = arr[left];
        //定义变量i,指向最左边
        int i = left;
        //定义变量j,指向最右边
        int j = right;

        //当i和j不相遇的时候,在循环中进行检索
        while (i != j){
            //先由j从右往左进行检索比基准数小的,如果检索到比基准数小的就停下
            //如果检索到比基准数大的或者相等的,就继续检索
            while (arr[j] >= base && i<j){
                j--;//j从右往左移动
            }
            //i从左往右检索
            while (arr[i]<=base&& i<j){
                i++; //ic从左往右检索
            }

            //代码走到这里。i停下了,j也停下了。然后交换i和j位置的元素
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }

        //如果i = j,说明i和j相遇,就交换基准数这个元素和相遇位置的元素
        arr[left] = arr[i];
        arr[i] = base;

        //基准数在这里就归位了,左边的数字都比他小,右边的数字都比他大
        //排基准数左边
        quickSort(arr,left,i-1);
        //排完左边排右边
        quickSort(arr,j+1,right);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值