归并排序算法

ops/2025/1/20 1:02:02/

归并排序

在这里插入图片描述

1算法介绍

和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的算法>排序算法。该算法是采用分治法的一个非常典型的应用。

2基本思想

基本思路就是将数组分成二组 A,B,如果这二组组内的数据都是有序的,那么就可以 很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将 A,B 组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

#include <stdio.h>void find(int arr[], int left, int mid, int right)
{int i, j, k;             // 定义索引变量int n1 = mid - left + 1; // 计算左边子数组的长度int n2 = right - mid;    // 计算右边子数组的长度int L[n1], R[n2];        // 创建左右两个临时数组for (i = 0; i < n1; i++){L[i] = arr[left + i]; // 将左子数组元素复制到L中}for (j = 0; j < n2; j++){R[j] = arr[mid + 1 + j]; // 将右子数组元素复制到R中}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++; // 移动合并后数组的索引}while (i < n1){                  // 如果左子数组还有剩余元素arr[k] = L[i]; // 将左子数组的剩余元素放入合并后的数组i++;           // 移动左子数组的索引k++;           // 移动合并后数组的索引}while (j < n2){                  // 如果右子数组还有剩余元素arr[k] = R[j]; // 将右子数组的剩余元素放入合并后的数组j++;           // 移动右子数组的索引k++;           // 移动合并后数组的索引}return;
}
void merge(int arr[], int left, int right)
{if (left < right){                                        // 如果左边界小于右边界,说明还有多个元素需要排序int mid = left + (right - left) / 2; // 计算中点,避免溢出merge(arr, left, mid);               // 对左子数组进行归并排序merge(arr, mid + 1, right);          // 对右子数组进行归并排序find(arr, left, mid, right);         // 合并两个已排序的子数组}return;
}int main()
{int arr[] = {38, 27, 43, 3, 9, 82, 10};int n = sizeof(arr) / sizeof(arr[0]);merge(arr, 0, n - 1); // 调用归并排序函数,对数组进行排序printf("排序后为: \n");for (int i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

http://www.ppmy.cn/ops/151519.html

相关文章

自动化之Ansible

一、Ansible介绍 Ansible是一个同时管理多个远程主机的软件(任何可以通过SSH协议登录的机器)&#xff0c;因此Ansible可以管理 运程虚拟机、物理机&#xff0c;也可以是本地主机(linux、windows)。 Ansible通过SSH协议实现 管理节点、远程节点的通信。 只要是能够SSH登录的主机…

一个超快低延迟.Net网络通信库:支持TCP, SSL, UDP, HTTP,HTTPS, WebSocket多协议

今天给大家推荐一个性能好、低延迟.Net网络通信库&#xff0c;基本支持所有协议。 01 项目简介 NetCoreServer是一个基于.NET Core的开源项目&#xff0c;一个高性能、跨平台的异步套接字服务器与客户端库。该项目支持多种传输协议&#xff0c;包括TCP、SSL、UDP、HTTP、HTTP…

docker与部署微服务实战

2013年发布至今&#xff0c; Docker 一直广受瞩目&#xff0c;被认为可能会改变软件行业。 但是&#xff0c;许多人并不清楚 Docker 到底是什么&#xff0c;要解决什么问题&#xff0c;好处又在哪里&#xff1f;今天就来详细解释&#xff0c;帮助大家理解它&#xff0c;还带有…

Spring MVC拦截器完成用户登录权限验证的示例

【图书介绍】《SpringSpring MVCMyBatis从零开始学&#xff08;视频教学版&#xff09;&#xff08;第3版&#xff09;》_【新华文轩】springspring mvcmybatis从零开始学(视频教学版) 第3版 正版-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)&#xff08;第3版…

使用 Hadoop 实现大数据的高效存储与查询

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

什么是DNS缓存?DNS缓存有什么用?

DNS缓存在DNS解析过程中发挥了重要作用&#xff0c;有效提升了解析速度和访问体验。那什么是DNS缓存&#xff0c;DNS缓存有什么用呢&#xff1f;接下来国科云简单介绍下。 什么是DNS缓存&#xff1f; 标准的DNS解析过程&#xff0c;需要进行全球递归查询&#xff0c;依次去请…

word合并

手动方法&#xff1a; Word拆分生成多个文档与合并多个文档&#xff0c;多人协作办公必备技巧_Word联盟 java方法1_Spire.Doc for Java 优点&#xff1a;那是真简单&#xff0c;五行代码搞定。 缺点&#xff1a;付款哦&#xff0c;导包问题独立仓库 Java 合并 Word 文档 &…

你会选择java还是node做后台管理

目前后台开源千千万&#xff0c;但说好用且容易上手的也就那几个。 node和java就看你怎么选了 如果你擅长Java&#xff0c;那RuoYi首选 RuoYI后台管理系统https://gitee.com/y_project/RuoYi-Vue有vue2又有vue3。MIT协议全免费开源&#xff0c;功能齐全&#xff01; 如果你擅…