首页 > 其他分享 >归并排序

归并排序

时间:2022-08-22 14:01:09浏览次数:51  
标签:归并 递归 int 数组 排序 指针

1. 归并排序——分治

# 算法原理

归并排序的思想就是分治,先递归分解数组,再合并数组。

将数组分解到最小之后,再往上一层两两合并两个有序的数组,最终递归返回的就是一个排好序的数组。

递归分解的时间复杂度是O(logn),合并数组的时间复杂度是O(n),因此归并排序的时间复杂度就是O(nlogn)

# 步骤

  1. 确定分界点
    • mid = (l + r) / 2
  2. 递归调用左右区间
    • 一层层调用到底,从最底层归并
  3. 归并排序, 合二为一

# 如何实现合二为一?

合并的基本思路就是双指针算法,比较两个数组最前面的数字,谁小就先取谁,取了后相应的指针就往后移动一位。 然后再比较,直到一个数组为空,最后把一个数组的剩余部分复制过来即可。

  1. 找两个指针中较小的一个数,把值写入res[],然后指针右移
  2. 直到其中一个序列的指针指向最后一个
  3. 把另一个序列的指针剩下的数依次写入res[]

# 代码模板

const int N = 10e5 + 10;
int temp[N];
void merge_sort(int q[], int l, int r)
{
    if(l >= r) return;
    int mid = (l + r) >> 1;
    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);
    int i = l, j = mid + 1, k = 0;
    while(i <= mid && j <= r) {
        if( q[i] <= q[j] ) temp[k++] = q[i++];
        else temp[k++] = q[j++];
    }
    while(i <= mid) temp[k++] = q[i++];
    while(j <= r) temp[k++] = q[j++];
    for(i = l, j = 0; i <= r; i++, j++) q[i] = temp[j];
}

# 总结

归并排序没有太多复杂的边界问题,核心思想是分治,只要理解了这一点,基本上原理就弄清楚了。

在进行归并排序之前,先递归调用左右区间,可以理解为将数组二分分解。

调用到最深一层也就是区间里只有一个元素的时候,开始执行递归函数的返回,也就是执行归并的过程。

归并的过程可以如上图所示,每一层的都是把2个相邻的区间通过双指针算法排序并合并到一个区间(合并这个动作由递归返回发生),每次递归返回时区间都是有序的,最终合并回一个区间,完成排序。

需要注意的是,归并排序的时间复杂度是O(nlogn),但是中间过程需要用到一个数组来存放临时排序的结果,所以空间复杂度是O(n)。

2022.4.10

标签:归并,递归,int,数组,排序,指针
From: https://www.cnblogs.com/Ethan-Code/p/16612583.html

相关文章

  • AcWing算法基础课---第一讲基础算法---01排序
    快速排序步骤确定分界点:q[l],q[(l+r)/2],q[r],随机调整区间递归处理voidquick_sort(intq[],intl,intr){if(l>=r)return;//递归结束条件......
  • 分页和排序
    分页和排序排序--排序:升序asc,降序desc--orderby通过哪个字段排序,怎么排--查询的结果根据成绩降序排序SELECTs.`studentno`,`studentname`,`subjectname`,......
  • Mysql-排序与分页
    1.排序使用orderby进行排序:ASC(ascend)升序,DESC(descend)降序,一般把orderby语句放在select语句的结尾,多列排序的顺序按照orderby后的字段顺序进行......
  • 字典排序
    importoperatordefdeal_dict_sort():x=[{'name':'Homer','age':39},{'name':'Bart','age':10}]lx=sorted(x,key=operator.itemgetter('age'),......
  • 二叉排序数
    1.为什么要用二叉排序树使用数组数组未排序,优点:直接在数组尾添加,速度快。缺点:查找速度慢.数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据......
  • 2022-8-20 剑指offer-滑动窗口+(桶排序或者有序集合)
    剑指OfferII057.值和下标之差都在给定的范围内难度中等55收藏分享切换为英文接收动态反馈给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在......
  • 排序(上)
    目录冒泡排序(BubbleSort)插入排序(InsertionSort)选择排序(SelectionSort)冒泡排序和插入排序的比较最经典的、最常用的有:冒泡排序、插入排序、选择排序、归并排序、快速排......
  • 第6章 数组、排序和查找
    ​6.1 为什么需要数组Array     数组可以存放多个同一类型的数据,数组的数据类型是引用类型。6.2 数组的使用     ​​​​​​​1)使用方式1:动......
  • 堆排序 与 比较器
    堆排序假如给你一无序的数组,经过堆排序获得一组降序的数组1、首先我们将数组遍历,进行heapInsert,变为一个大根堆,建立堆的过程方法一:正序遍历+heapInsertO(N*logN)当需......
  • 【排序】各类排序算法的时间性能比较
    用https://www.luogu.com.cn/paste/nzx555us中代码在此题运行时限\(\tt1s\),空间限制\(\tt256MB\)。插入排序冒泡排序选择排序希尔排序快速排序归并排......