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

合并排序

时间:2024-10-10 13:35:37浏览次数:6  
标签:arr int 合并 ++ 序列 排序

一.算法介绍
合并排序(Merge Sort)是一种高效的、基于比较的排序算法,采用分治策略进行工作。其基本思想是将数组分成两半,递归地对每半部分进行排序,然后将两个有序的半部分合并成一个有序序列。
二.算法步骤
合并排序可以分为两个主要步骤:
1.分解:将待排序的序列分解成尽可能小的子序列,直到每个子序列只包含一个元素(或空序列)。
2.合并:将子序列两两合并,形成新的有序序列,直到所有子序列合并成一个完全有序的序列。
三.c语言代码:

#include <stdio.h>

void merge(int arr[], int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;

/* 创建临时数组 */
int L[n1], R[n2];

/* 复制数据到临时数组L[] 和 R[] */
for (int i = 0; i < n1; i++)
L[i] = arr[left + i];
for (int j = 0; j < n2; j++)
R[j] = arr[mid + 1+ j];

/* 合并临时数组回到arr[l..r]*/
int i, j, k;
i = 0; /* 初始化第一个和第二个子数组的初始索引 */
j = 0;
k = left; /* 初始索引的已排序子数组 */

while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}

/* 复制L[] 的剩余元素 */
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}

/* 复制R[] 的剩余元素 */
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}

/* l 是左边界索引, r 是右边界索引 */
void mergeSort(int arr[], int l, int r) {
if (l < r) {
// m是中间点
int m = l+(r-l)/2;

mergeSort(arr, l, m);
mergeSort(arr, m+1, r);

// 合并
merge(arr, l, m, r);
}
}

// 打印数组
void printArray(int A[], int size) {
int i;
for (i=0; i < size; i++)
printf("%d ", A[i]);
printf("\n");
}

int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int arr_size = sizeof(arr)/sizeof(arr[0]);

printf("Given array is \n");
printArray(arr, arr_size);

mergeSort(arr, 0, arr_size - 1);

printf("\nSorted array is \n");
printArray(arr, arr_size);
return 0;
}

四.时间复杂度
1.最好、最坏和平均时间复杂度均为 O(n log n)
2.空间复杂度为 O(n)
五.应用场景
合并排序适用于数据量大、对排序稳定性有要求的场景。由于其稳定的排序特性,以及较高的时间复杂度,它在处理大规模数据集时表现出色。
六.优缺点
1.优点:
①稳定排序:相同元素的相对位置不会改变。
②性能稳定:时间复杂度始终为 O(n log n)。
2.缺点:
①需要额外的存储空间:空间复杂度为 O(n)。
②递归调用可能带来一定的开销,尤其是在小数据集上。

合并排序是一种非常实用且高效的排序算法,在实际应用中具有广泛的适用性。

标签:arr,int,合并,++,序列,排序
From: https://www.cnblogs.com/blbinary/p/18456130

相关文章

  • 5.3 C#数组的基本操作与排序(数组赋值、最大最小值、冒泡排序、选择排序、Array类排序)
    文章目录5.3.1C#数组对象的赋值例5-5:通过循环给一维数组赋值例5-6:通过键盘输入给数组赋值5.3.2C#数组对象的输出例5-7:不同类型数组的输出5.3.3C#求数组中的最大(小)元素值例5-8:求数组中的最大值和最小值5.3.4C#数组排序1.使用Array类排序(例5-9)2.冒泡排序(例5-......
  • 算法笔记(十五)——BFS 解决拓扑排序
    文章目录拓扑排序课程表课程表II火星词典拓扑排序有向无环图(DAG图)有向无环图指的是一个无回路的有向图AOV网:顶点活动图在有向无环图中,用顶点表示一个活动,用边来表示活动的先后顺序的图结构拓扑排序找到一个先后顺序,结果可能不唯一如何拓扑排序?找到一......
  • 基于C语言的排序
    排序的概念:排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]......
  • 合并、删除区间算法C++代码
    #include<algorithm>#include<iostream>#include<vector>usingnamespacestd;classSolution{public:constintCOMBINE_INT=0;//1表示整数点区间,比如[1:3]和[4:5]会合并为[1:5],0则仅会合并[1:3]和[3:4]这类的区间。vector<pair<int,int>>......
  • PDF电子发票怎么合并在一起,免费在线教学
    在日常生活和工作中,我们常常需要处理多个PDF格式的发票。这些文件可能来自不同的商家或服务,而合并它们成为一个文档,不仅方便查阅,还能帮助我们更好地管理财务。今天,我将为大家提供一份简单易懂的教程,教你如何免费合并多个PDF发票,轻松实现文档整合。为什么需要合并PDF发票?合并......
  • EasyExcel读取合并单元格数据
    EasyExcelEasyExcel文档地址:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read一、前言当excel表格的数据表头和内容都比较工整,每个单元格对应一个数据时,通过EasyExcel可以很容易就将数据读取出来。但是当表格数据存在合并单元格时,还是按照EasyExc......
  • 【数据结构与算法】排序算法
    3.7排序算法概述比较排序算法算法最好最坏平均空间稳定思想注意事项冒泡O(n)O(n2n^2......
  • 排序算法之选择排序
    选择排序的思想是每次从未排序的部分中选择最小的元素,然后将其放在已经排序部分的末尾。遍历数组,从第一个元素开始,将其视为当前最小元素。在未排序的部分中,找到最小的元素,并记录其索引。将最小的元素与当前位置的元素交换位置重复步骤2和步骤3,直到遍历完整个数组比如有一......
  • 【堆】【优先队列】[NOIP2004]合并果子
    https://ac.nowcoder.com/acm/contest/22669/I堆的用法Type:队列中存储元素的类型。例如int,double,pair<int,int>等。Container:底层存储数据的容器类型,默认为vector,但可以换成deque或其他容器。Compare:比较函数,用于决定优先级顺序。默认是less,表示最大堆。如果使用......
  • 23_合并K个升序链表
    23_合并K个升序链表【问题描述】给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。【算法设计思想】使用优先队列(最小堆)设计思想:初始化优先队列:创建一个最小堆(优先队列),将每个链表的第一个节点加入堆中。这里堆中存储的是节......