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

归并排序

时间:2024-01-22 16:45:55浏览次数:21  
标签:sort 归并 int merge 划分 排序

归并排序

一、核心思想

递归;分治;归并

二、实现思路

1、 相较于快速排序,归并排序将划分区间和排序两个操作在放在不同时间段上,也因此引出了归并的操作。
基于此思想———— 先分再排 顺便合并 ,应当首先使用递归来进行划分,划分标准直接从中间位置划分即可
2、 划分之后,对于单个区间之间可以从中心的起始处,依次取到当前最小的,并放到 当前划分情况的临时数组
(如果将中间看成分割线,那么将会是一对区间:可以形象的比喻成两幅从小到大(或者从大到小)的牌“并排”在桌面上,我们只需要对最每副牌的 最左手边 起这两张牌进行比较,取其中最小(或最大)的,拿到第三方,这样依次从左边进行到右边一次,就完成了当前划分区间的排序操作,并且“顺便合并”了,这对于 当前的 区间的时间复杂度就是O(n),而 ** 整体的时间复杂度为  O(nlogn)   ** )

三、代码实现

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);

    /*
    排序且合并数据
    需要注意:
    	1、需要有关于当前数据划分情况的临时数组tmp[r-l+1],大小是数据量
    	(当前的最右边下标-当前的最左边下标+1,加一的原因:“两端都要种树的情况下的种树问题”)
    	2、对于两部分长度不一致:直接把多余的部分移过去即可
    */
    int k = 0, i = l, j = mid + 1, tmp[r - l + 1];
    while(i <= mid && j <= r)
        if(q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
    while(i <= mid) tmp[k++] = q[i++];
    while(j <= r) tmp[k++] = q[j++];
	/*
	此外,还要注意,把排好序的临时数组tmp 覆盖 给q数组以便继续和下一个进行归并排序(或者是展示为最终结果)
	*/
    for(k = 0, i = l; i <= r; k++, i++) q[i] = tmp[k];
}
int main()
{
  int a[50]={9,6,2},n=3;
    
  //a:数组,0,n-1:为排序区间  
  merge_sort(a,0,n-1);
  
  for(ll i=0;i<n;i++){
    cout<<a[i]<<" ";
  }
  return 0;
}

标签:sort,归并,int,merge,划分,排序
From: https://www.cnblogs.com/bianchengafeng/p/17980373

相关文章

  • 图论总结——拓扑排序
    图论总结——拓扑排序例\(1\):排水系统(不是很模板的模板题)思路模板题,但是要进行分数约分,所以又不是很模板直接进行计算即可。注意计算过程中很可能爆\(long~~long\)类型范围,需要用\(int128\)类型进行存储。\(Code\)#include<bits/stdc++.h>#defineintlonglongusi......
  • SQL—排序专用窗口函数
    下面介绍三种用于进行排序的专用窗口函数:1、RANK()   在计算排序时,若存在相同位次,会跳过之后的位次。   例如,有3条排在第1位时,排序为:1,1,1,4······2、DENSE_RANK()   这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次。   例如,有3......
  • 图论总结——拓扑排序
    图论总结——拓扑排序例\(1\):排水系统(不是很模板的模板题)思路模板题,但是要进行分数约分,所以又不是很模板直接进行计算即可。注意计算过程中很可能爆\(long~~long\)类型范围,需要用\(int128\)类型进行存储。代码#include<bits/stdc++.h>#defineintlonglongusingn......
  • 桶排序 -解决了什么问题
    桶排序法的优点高效的时间复杂度:在均匀分布的情况下,桶排序的平均时间复杂度接近线性,具有较高的排序效率。这是因为桶排序将元素分散到多个桶中,每个桶独立地进行排序,而不需要像比较排序算法那样逐个比较和交换元素。适用于外部排序:桶排序适用于需要排序的数据量非常大,无法全部......
  • sort排序疑惑
    今天做到了一道题是这样的:病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:1.老年人(年龄≥60岁)比非老年人优先看病。2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。3.非老年人按登记的先后顺序看病。输入格式第1行,输入一个小于10......
  • 排序算法的性能比较
    写在前面菜鸡博主最近放寒假了,打算接下来的一段时间内回顾一下以前学过的一些知识,也是为考研做一些准备吧。很菜,勿喷,希望能和大家一起学习,共同进步!主要目标和具体要求目标排序对于数据处理是一项十分重要和基础的工作。采用如下算法实现排序功能:插入排序、交换排序、选择排序......
  • 自定义排序
    问题:如何对数据进行自定义排序函数解决:=SORTBY(A2:A21,MATCH(A2:A21,E2:E11,))按自定义序列排序:选取数据中任一单元格》数据(或开始)》排序》自定义排序》勾选包含标题》次序》自定义序列》选取》确定》确定设置自定义序列:选取数据》文件》选项》自定义序列》从单元格导......
  • 排序算法与查找
    1.排序1.1冒泡排序冒泡排序,就是将相邻两个元素进行比较,如果前面那个元素和后面那个元素进行比较,如果前面元素比后者元素大,则进行交换位置。下面举例: 由图可知,共有5个元素,进行了四轮比较,假设有n个元素,则进行n-1轮比较(外部循环)。内部元素比较变化:第一轮把最大的元素给去......
  • compareTo、Comparator、TreeSet排序那些事
    前言:对于后端开发而言,学会对数据的自定义排序还是十分有必要的。需要用到排序的场景也是很多的,什么排行版展示、利用时间+别的条件排序、还有预接单的数据就是要展示在已接单的数据前面这种需求、等等。总之很重要的!一:对集合排序对以下的数据做展示顺序排序:未接单>预接单>已接单。(......
  • 最少交换次数 置换环 LeetCode 2471. 逐层排序二叉树所需的最少操作数目
    voidMain(){ varroot=newTreeNode(1) { left=newTreeNode(3) { left=newTreeNode(7), right=newTreeNode(6) }, right=newTreeNode(2) { left=newTreeNode(5), right=newTreeNode(4) } }; varr=newSolution().Minimu......