首页 > 其他分享 >归并排序原理、演示及代码

归并排序原理、演示及代码

时间:2023-10-06 13:56:13浏览次数:37  
标签:归并 演示 int 合并 列表 数组 排序

归并排序

1.原理

归并排序是一种排序算法,它通过将待排序的数组或列表递归分割成较小的子数组,然后将这些子数组合并以生成一个有序的数组。

2.操作

  • 分割(Divide):将待排序的数组分成两个大致相等的子数组,或者将列表分成两部分。这个过程是递归的,直到每个子数组或子列表都只包含一个元素为止。
  • 合并(Merge):逐个合并两个有序的子数组(或子列表),以生成一个新的有序数组(或列表)。在合并过程中,通过比较两个子数组(或子列表)中的元素,将较小的元素放入新的有序数组(或列表),并继续这个过程,直到所有元素都合并为止。
  • 递归:重复上述分割和合并过程,直到整个数组(或列表)都被排序为止。

3.演示

先递归分割,再逐步合并

4.代码

 		/**
         * @param nums 待排序数组
         * @param low  数组的开始元素索引
         * @param high 数组的结束元素索引
         * @return 升序排列的数组
         */
        public int[] mergeSort(int[] nums, int low, int high) {
            if (high - low <= 0) {
                int[] ints = new int[1];
                ints[0]=nums[low];
                return ints;
            }
            int mid = (low + high) / 2;
            int[] leftNums = mergeSort(nums, low, mid);
            int[] rightNums = mergeSort(nums, mid+1, high);
            int[] res = new int[leftNums.length+rightNums.length];
            int li = 0, ri = 0, i = 0;
            while (ri < rightNums.length && li < leftNums.length) {
                if (leftNums[li] < rightNums[ri]) {
                    res[i] = leftNums[li];
                    li++;
                    i++;

                } else {
                    res[i] = rightNums[ri];
                    ri++;
                    i++;
                }
            }
            if (li == leftNums.length) {
                while(ri<rightNums.length){
                    res[i] = rightNums[ri];
                    ri++;
                    i++;
                }
            }else{
                while(li<leftNums.length){
                    res[i] = leftNums[li];
                    li++;
                    i++;
                }
            }
            return res;

        }

标签:归并,演示,int,合并,列表,数组,排序
From: https://www.cnblogs.com/lanailearn/p/17744503.html

相关文章

  • 【C语言入门】快速排序函数的应用
    快速排序函数qsortvoidqsort(void*base,typenitems,typesize,int(cmp)(constvoid*p1,constvoid*p2));参数说明:base  指针要排序的数组的首元素指针nitems  数组元素的总个数size  数组中每一个元素的字节大小cmp  函数指针(用来比较两个元素的函数)比......
  • 为什么处理已排序数组比处理未排序数组更快?
    在这个C++代码中,在计时区域之前对数据进行排序(*)使得主循环快6倍:#include<algorithm>#include<ctime>#include<iostream>intmain(){//生成数据constunsignedarraySize=32768;intdata[arraySize];for(unsignedc=0;c<arraySize;++c)......
  • Leetcode刷题83. 删除排序链表中的重复元素
    给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:head=[1,1,2,3,3]输出:[1,2,3] 提示:链表中节点数目在范围 [0,300] 内-100<=Node.val<=100题目数......
  • 快速排序
    快速排序使用java实现快速排序publicstaticvoidquickSort(int[]arr,intl,intr){if(l>=r){return;}intlift=l;intright=r;//选取比较的值,取需要排序的序列的第一个数作为基值intp=ar......
  • 第8章 排序
    一、插入排序基本思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列,直到全部记录插入完成直接插入排序时间复杂度:最好O(n):表中元素有序,最坏O(n2):表中元素逆序空间复杂度:O(1)稳定性:稳定,总是插入到相同元素的后面适用性:顺序、链式(从前往后查找指定元素......
  • 快速排序
    一、算法描述快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。快速排序的基本思想:通过一趟排序将待排序的序列分割为左右两个子序列,左边的子序列中所有数据都比右边子序列中的数据小,然后对左右两个子序列继续进行......
  • AcWing_1_1_785_快速排序
    一、题目描述给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数n。第二行包含n个整数(所有整数均在\(1∼10^9\)范围内),表示整个数列。输出格式输出共一行,包含n个整数,......
  • 合并区间(区间排序,vector的动态扩容的应用)
    以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例1:输入:intervals=[[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间[1,3......
  • 根据某个关键字的指定顺序,重新对数据源快速排序!
    1职场实例小伙伴们大家好,今天我们来继续重温并学习一个Excel使用过程中最基础的技巧之一:如何根据某个关键字指定的顺序,重新对数据源快速排序?这个问题算是判断掌握Excel是否熟练的一个重要指标了,下面我们就来看一下具体的问题场景。如下图所示:A1:B6单元格区域为数据源区域,为一份水果......
  • 【基础算法】排序算法 —— 插入排序
    一、算法原理插入排序将数组分为已排序区间和未排序区间,初始已排序区间只有数组第1个元素,未排序区间从下标1开始到数组末尾。每次取未排序区间的第1个元素,将它插入已排序区间的合适位置,并保证已排序区间一直有序。重复这个过程,直到未排序区间为空,算法结束。给有序数组(已排序区......