首页 > 其他分享 >【模版】归并排序

【模版】归并排序

时间:2023-12-20 17:01:07浏览次数:53  
标签:归并 int 模版 arr mid 数组 排序

归并排序,它有两大核心操作.

  • 一个是将数组一分为二,一个无序的数组成为两个数组。
  • 另外一个操作就是,合二为一,将两个有序数组合并成为一个有序数组。

时间复杂度情况:

最好和最快情况都是:O(NlogN)

代码模版如下

int arr[N], temp[N];

void merge_sort(int arr[], int l, int r) {
    if (l >= r)
        return;
//递归结束条件
    int mid = l + r >> 1;

    merge_sort(arr, l, mid), merge_sort(arr, mid + 1, r);
//递归处理子问题
    int k = 0, i = l, j = mid + 1;
//归并
    while (i <= mid && j <= r) {
        if (arr[i] <= arr[j])
            temp[k ++] = arr[i ++];
        else
            temp[k ++] = arr[j ++];
    }
//收尾
    while (i <= mid)
        temp[k ++] = arr[i ++];
    while (j <= r)
        temp[k ++] = arr[j ++];

    for (int i = l, j = 0; i <= r; i++, j++)
        arr[i] = temp[j];
}

图解如下:

更详细的见下面的连接:

AcWing 787. 归并排序的证明与边界分析 - AcWing

标签:归并,int,模版,arr,mid,数组,排序
From: https://www.cnblogs.com/Yukie/p/17916969.html

相关文章

  • 【模版】快速排序
    快速排序基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。算法复杂度最差时间复杂度O(N2)平均时间复杂度O(Nl......
  • 桶排序
    桶排序计数排序&基数排序思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容特点:不基于比较的排序算法思路计数排序申明一个定长数组,遍历数据并在对应数值的下标频率统计加一,最后根据频率数组进行输出。待排序的数据必须有范围......
  • [LeetCode] LeetCode81. 搜索旋转排序数组II
    题目描述思路:是lc33.搜索旋转排序数组的延伸,允许包含重复元素起初:当nums[left]<=nums[mid]时,区间[left,mid]有序当nums[left]>nums[mid]时,区间[mid,right]有序但是这个题目当nums[left]==nums[mid]时,无法判断哪个区间是有序的,无法判断target位于左侧还是右侧,此时无......
  • [LeetCode Hot 100] LeetCode153. 寻找旋转排序数组中的最小值
    题目描述思路如果数组翻转后又回到升序的情况,即nums[left]<=nums[right],则nums[left]就是最小值,直接返回。如果数组翻转,需要找到数组中第二部分的第一个元素:若nums[left]<=nums[mid],说明区间[left,mid]连续递增,则最小元素一定不在这个区间里,可以直接排除,最小值在[......
  • 912. 排序数组---快速排序
    1.题目介绍给你一个整数数组 \(nums\),请你将该数组升序排列。示例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*10^{4}\)\(-5*10^{4}<=nums[i]<=5*10^{4}\)2.题解2.1随机化快速排......
  • 详解十大经典排序算法(五):归并排序(Merge Sort)
    算法原理归并排序的核心思想是将一个大的数组分割成多个小的子数组,然后分别对这些子数组进行排序,最后将排序后的子数组合并起来,得到一个有序的大数组。算法描述归并排序(MergeSort)是一种经典的排序算法,其原理基于分治(DivideandConquer)策略。它的核心思想是将一个大问题分割成多个......
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)
    算法原理希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小增量,最终使整个序列有序。算法描述希尔排序(ShellSort)是一种基于插入排序的算法,由DonaldShell于1959年提出。它是插入排序的一种......
  • 堆排序
    堆排序heapInsert&heapify排序思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题描述对一个数组进行大根堆排序算法思路heapInsert:视为用户一个个插入新数值,由下往上比较heapify:视为对所有子树排序,由子树的头结点从上往......
  • [LeetCode Hot 100] LeetCode33. 搜索旋转排序数组
    题目描述思路如果nums[left]<=nums[mid],则[left,mid]有序如果nums[left]>nums[mid],则[mid,right]有序方法一:classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;intleft=0,ri......
  • [LeetCode Hot 100] LeetCode34.在排序数组中查找元素的第一个和最后一个位置
    题目描述思路:二分查找之寻找左右侧边界两个关键点:1.数组有序;2.时间复杂度O(logn)方法一:classSolution{publicint[]searchRange(int[]nums,inttarget){if(nums.length==0||nums==null){returnnewint[]{-1,-1};}......