题解 | #排序#

排序

https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896

import java.util.*;
import java.util.Arrays;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 将给定数组排序
     * @param arr int整型一维数组 待排序的数组
     * @return int整型一维数组
     */
    //
    public int[] MySort (int[] arr) {
        // write code here
        if (arr.length < 2) return arr;
        quickSort(arr, 0, arr.length - 1);
        return arr;

    }
    private void quickSort(int[] array, int low, int high) {

        //快排子区间越往下划分,越趋近于有序,考虑使用简单插入排序可以优化性能
        // 如果数组区间长度小于500采用插入排序
        if (high - low <= 500) {
            insertSort(array);
            return;
        }
        //随机选择一个数作为枢轴
        Random random = new Random();
        int index = random.nextInt(array.length);
        int pivot = array[index];
        array[index] = array[low];//low位置为无效数据
        int cur_low = low;
        int cur_high = high;
        while (cur_low < cur_high) {
            while (cur_low < cur_high && array[cur_high] >= pivot) {
                cur_high--;
            }
            if (cur_low < cur_high) { //已经找到
                array[cur_low] = array[cur_high];
                cur_low++;//减少重复比较
            }
            while (cur_low < cur_high && array[cur_low] <= pivot) {
                cur_low++;
            }
            if (cur_low < cur_high) {
                array[cur_high] = array[cur_low];
                cur_high--;//减少重复比较
            }
        }
        array[cur_low] = pivot;
        quickSort(array, low, cur_low - 1);
        quickSort(array, cur_low + 1, high);


    }
    public static void insertSort(int[] arr) {
        int i, j;
        //4,2,1,7,8
        for (i = 1; i < arr.length; i++) {
            if (arr[i - 1] > arr[i]) {
                //temp=2
                int temp = arr[i];//设置哨兵
                //必须要保证数组下标>=0,才for循环
                for (j = i - 1; j >= 0 && arr[j] > temp ; j--) {
                    arr[j + 1] = arr[j]; //arr[1]=4
                }
                //j=-1
                arr[j + 1] = temp; //arr[0]=2
                //2 4 1 7 8
            }
        }
    }
}

全部评论
区间长度为多少选择简单插入排序最优可以自测
点赞 回复 分享
发布于 05-08 13:47 河南

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-26 15:46
已编辑
字节国际 电商后端 24k-35k
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务