首页 > 其他分享 >912.排序数组

912.排序数组

时间:2024-10-15 13:18:33浏览次数:3  
标签:归并 nums int 复杂度 数组 排序 912

这一题我们要用归并排序的方法

归并排序
1)整体就是一个简单递归,左边排好序、右边排好序、让其整体有序
2)让其整体有序的过程里用了排外序方法
3)利用master公式来求解时间复杂度
4)归并排序的实质
时间复杂度O(N*logN),额外空间复杂度O(N)

912.排序数组

给你一个整数数组 nums,请你将该数组升序排列。

你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

提示:

  • 1 <= nums.length <= 5 * 104
  • -5 * 104 <= nums[i] <= 5 * 104

 思路分析:

假设我们给数组【3,2,1,5,6,2】进行排序,每次都将数组分为一半,第一次递归得到数组【3,2,1】和【5,6,2】;然后我们再进行第二次递归,【3,2,1】拆分为【3,2】和【1】,【5,6,2】则拆分为【5,6】和【2】;然后进行第三次递归,【3,2】拆分为【3】、【2】,【5,6】拆分为【5】、【6】。

我们来到最后一步得到的数组为[1,2,3]和[2,5,6],得到的这两个有序的数组都是用的归并排序,那么怎么用归并排序进行最后一步呢。

我们分别用两个指针p1,p2指向每一个数组的第一个,然后用指针指向的数进行比较,将小的数存入到新的数组,然后该指针向前走一步.直到其中的一个指针越界,比较就比完了,然后就将另一个没有越界的指针指向的数组剩余的元素存入新的数组。最后将新数组赋值到原来的数组。

代码实现: 

class Solution {
    public int[] sortArray(int[] nums) {
        if(nums==null || nums.length<2){
            return nums;
        }
        process(nums,0,nums.length-1);
        return nums;
    }

    public static void process(int[] arr, int L, int R){
        if(L==R){
            return;
        }
        int mid = L + ((R-L)>>1);
        process(arr,L,mid);
        process(arr,mid+1,R);
        merge(arr,L,mid,R);
    }

    public static void merge(int[] arr,int L, int M,int R){
        int[] help = new int[R-L+1];
        int p1 = L;
        int p2 = M+1;
        int i =0;
        while(p1<=M&&p2<=R){
            help[i++] = arr[p1] <= arr[p2] ? arr[p1++]:arr[p2++];
        }
        while(p1<=M){
            help[i++] = arr[p1++];
        }
        while(p2<=R){
            help[i++] = arr[p2++];
        }

        for(i = 0; i<help.length; i++){
            arr[L+i] = help[i];
        }
    }
}

标签:归并,nums,int,复杂度,数组,排序,912
From: https://blog.csdn.net/m0_74039408/article/details/142946906

相关文章

  • 最详细!如何实现数组和List之间的转换?(含详细代码解析,面试题拓展)
            数组和List都是我们平时工作,或者主动学习中经常使用的数据结构,在项目中难免会出现需要将其相互转换的场景,同时也正因为此,面试也偶尔会被问到。本文将从其调用的方法,以及其原理、特点展开,希望能让各位读者有所收获,码海无涯,愿与大家共勉。1,数组转换为List1,使用......
  • Java常见排序算法-插入排序
    一、算法介绍 插入排序是一种简单且常用的排序算法,它的实现思路是将列表分为已排序和未排序两部分,每次从未排序部分取出一个元素,将它插入到已排序部分的适当位置,最终将列表排序完成。即将未排序的数值直接插入有序的一组数中,使得插入后的这组数还是有序的。二、算法示意图......
  • vue中如何检测数组变化(vue基础,面试,源码级讲解)
    大家有什么不明白的地方可以分享在评论区,大家一起探讨哦~~(如果对数据劫持还有所不明白的小伙伴,可以去看看上一篇文章哦)在vue2中,是如何对数组进行劫持的呢?简单代码实现: 在vue2中,不会对数组的每一项数据进行递归Object.defineProperty()方法劫持,这样是很浪费性能的。而......
  • java数组讲解
    前言:由上两章,我们已经了解关于java的基础语法,这章我们将讲解数组的相关语法,坐好了没,我们准备要发车啦!!!我们将从五部分给大家讲解:1数组的基本概念2.数组是引用类型3.数组的应用场景4.数组的练习5.二维数组1数组的基本概念:1.1 为什么要使用数组1.存储多个相同类型的......
  • Java二维数组
    Java中的二维数组是一个存储多个一维数组的数组。它可以被看作是一个表格或者矩阵。声明一个二维数组的方法如下:dataType[][]arrayName;其中,dataType是指定数组元素类型的数据类型,arrayName是数组的名称。初始化二维数组的方法有两种:指定数组的大小,并逐个赋值:dataType......
  • 【C语言刷力扣】2206.将数组划分成相等数对
    题目:解题思路:    题目中要求元素成数对出现,即每个元素出现偶数次。用哈希表存放每个数出现的次数,再循环查看每个数的次数是否位偶数。typedefstruct{intkey;intcount;UT_hash_handlehh;}hashEntry;booldivideArray(int*nums,intnumsS......
  • 代码随想录算法训练营第三十二天|122.买卖股票的最佳时机 II 55. 跳跃游戏 45.跳跃游
    122.买卖股票的最佳时机II给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例1:输入:[7,1,5......
  • 算法题——合并两个已排序链表(不使用额外空间)
    题目如下:        输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。        数据范围: 0≤n≤10000≤n≤1000,−1000≤节点值≤1000−1000≤节点值≤1000要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)      ......
  • 第2课-枚举、排序、贪心
    前言如果认为自己代码没问题,换行问题,边界问题等都处理了还是不行,可以试试交C++(GCC9)该类型,因为部分题目是UVA上的老题,可能不支持新版本的C++。如果提交UNKNOWNERROR,应该是没绑定UVA账号,洛谷右上角个人设置里去填写注册一下即可。除法Division思路这个题一定要注意输......
  • C语言-用指针遍历二维数组
    一、1.用一级指针遍历二维数组7#include<stdio.h>89intmain(intargc,char*argv[])10{11inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};12int*p;13p=*a;14inti;15for(i=0;i<12;i++){16if(i!=0&&i%4==0)17......