合并排序算法

server/2024/10/18 18:26:59/

基本思想:将待排序元素分为大小一致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

1.将一个集合分成两个大小一致的2个子集合:

2.先对左右两边两个子集进行排序,需要再次分成两个更小的子集。分集合直到子数组的长度为1时停止递归。

3.对上诉子集合分别进行排序并合成大集合

代码:

1.对大集合不断划分成相等的两个小集合:mid=(right+left)/2,左边小集合为(left,mid),右边小集合为(mid+1,right)

void mergeSort(int A[],int left,int right) {if (left==right) {return;}if (left<right) {int mid = (right + left) / 2;mergeSort(A,left,mid);mergeSort(A,mid+1,right);}
}

2.分成直到子数组的长度为1时进行排序并合成大集合:范围是(left,right)

merge(A,left,right);

        2.1两个小的集合进行排序并合成大集合,比较左边集合和右边集合的第一个数据哪个小就放在第一个位置,以上诉例子为基础:排序(左边集合1 3 9和右边集合2 5 8)

1和2比,1小,放第一位,3和2比,2小放第二位,9和5比,5小放第三位,9和8比,8小放第四位,剩下的未放置的9直接跟在新集合的后面。

void merge(int A[], int left, int right) {//排序合并int n = right - left + 1;int *b=(int *)malloc(sizeof(int)* n);int i = 0, mid = (right + left) / 2;int l = left, k = mid + 1;while ((l<= mid) && (k <= right)) {if (A[l] < A[k]) {//左边集合跟右边集合的数进行比较,谁小谁放前面b[i++] = A[l++];}else {b[i++] = A[k++];}}if (l > mid) {//后面一个小分组还有剩余未处理的数for (k; k <= right; k++) {b[i++] = A[k];//直接放在新集合的后面}}if (k>right) {//前面小分组还有剩余未处理的数for (l; l <= mid;l++) {b[i++] = A[l];}}//再将b数组中的数据全部复制到A中for (int j = 0; j < n;j++) {A[left+j] = b[j];}free(b);
}

完整代码:

#include<stdio.h>
#include<malloc.h>//打印排序好的数组
void printfA(int A[], int n) {for (int i = 0; i < n; i++) {printf("%d ", A[i]);}printf("\n");
}void merge(int A[], int left, int right) {//排序合并int n = right - left + 1;int *b=(int *)malloc(sizeof(int)* n);int i = 0, mid = (right + left) / 2;int l = left, k = mid + 1;while ((l<= mid) && (k <= right)) {if (A[l] < A[k]) {b[i++] = A[l++];}else {b[i++] = A[k++];}}if (l > mid) {//后面一个小分组还有剩余未处理的数for (k; k <= right; k++) {b[i++] = A[k];}}if (k>right) {//前面小分组还有剩余未处理的数for (l; l <= mid;l++) {b[i++] = A[l];}}//再将b数组中的数据全部复制到A中for (int j = 0; j < n;j++) {A[left+j] = b[j];}free(b);
}void mergeSort(int A[],int left,int right) {if (left==right) {return;}if (left<right) {int mid = (right + left) / 2;mergeSort(A,left,mid);mergeSort(A,mid+1,right);merge(A,left,right);}
}int main() {int n;printf("请输入排序数字得个数:");scanf_s("%d",&n);int *A = (int*)malloc(sizeof(int)*n);printf("请输入排序得数字:");for (int i = 0; i < n;i++) {scanf_s("%d",&A[i]);}mergeSort(A,0,n-1);printfA(A, n);free(A);return 0;
}


http://www.ppmy.cn/server/22688.html

相关文章

Spring 之 MatchingStrategy

在Spring框架的上下文中&#xff0c;MatchingStrategy 特别指代处理URL路径匹配的方法策略。这是Spring MVC中一个关键的概念&#xff0c;用于决定HTTP请求的URL路径应当如何与控制器&#xff08;Controller&#xff09;中的请求映射&#xff08;RequestMapping&#xff09;进行…

设计模式-状态模式(State Pattern)结构|原理|优缺点|场景|示例

设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型&#xff08;5种&#xff09; 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型&#xff08;7种&#xff09; 适配器…

(超全)python图像处理详细解析(4)

图像处理 34.边缘检测35.gabor滤波36.画线条37.画实心圆38.画四边形39.画六边形40.画椭圆形41.画空心圆42.平移图像43.图像的镜像 34.边缘检测 &#xff08;1&#xff09;sobel算子&#xff1a;可用来检测边缘 &#xff08;2&#xff09;scharr算子&#xff1a;同sobel算子 &a…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

代谢组数据分析三:差异分析

Differetial Analysis 差异分析的目的是为了筛选代谢物标记物,常用的方法有以下几种 倍数变化法 (Fold Change),也有基于log2的Fold change,计算组间倍数变化 T检验,计算组间均值的t统计量差别 PLS-DA或OPLS-DA的VIP(Variable Importance for the Projection,变量投影重要…

进程的概念(2)

进程优先级 1.什么的优先级 概念&#xff1a;指定进程获取某种资源&#xff08;CPU&#xff09;的先后顺序 本质&#xff1a;优先级的本质是优先级数字的大小&#xff0c;Linux中优先级数字越小&#xff0c;优先级越高 task_struct 进程控制快-> struct -> 内部字段 -&g…

【项目学习01_2024.04.27_Day02】

学习笔记 3 课程查询3.4 生成接口文档ApiOperation("课程查询接口") 和Api注解的区别Api(value "课程信息编辑接口",tags "课程信息编辑接口")其中的value和tags有什么用呢Swaager的常用注解如下&#xff1a;3.5 开发持久层3.5.1 生成mapper3.…

AI项目二十:基于YOLOv8实例分割的DeepSORT多目标跟踪

若该文为原创文章&#xff0c;转载请注明原文出处。 前面提及目标跟踪使用的方法有很多&#xff0c;更多的是Deepsort方法。 本篇博客记录YOLOv8的实例分割deepsort视觉跟踪算法。结合YOLOv8的目标检测分割和deepsort的特征跟踪&#xff0c;该算法在复杂环境下确保了目标的准…