合并排序算法

devtools/2024/10/18 18:16:21/

基本思想:将待排序元素分为大小一致相同的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/devtools/23025.html

相关文章

从流形的观点分析神经网络

从流形的观点分析神经网络 无意中看到一本用数学分析神经网络的书&#xff0c;里面用各种数学工具来分析神经网络&#xff08;如数学分析、线性代数、流形、信息论、概率论、优化等&#xff09;&#xff0c;书的信息如下&#xff1a; Ovidiu Calin, Deep Learning Architecture…

《Fundamentals of Power Electronics》——转换器串联

转换器可以如下图一样串联使用。 转换器1的传输比为 M1(D)&#xff0c;故它的输出电压 V1 为&#xff1a; 转换器1的输出电压作为转换器2的输入电压。令转换器2的占空比D等于转换器1的占空比。若转换器2的传输比为M2(D)&#xff0c;则它的输出电压V为&#xff1a; 联立上述两式…

C语言:数据结构(单链表)

目录 1. 链表的概念及结构2. 实现单链表3. 链表的分类 1. 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表的指针链接次序实现的。 链表的结构跟火车车厢相似&#xff0c;淡季时车次的车厢会相应…

保持话题一致性,Nvidia新研究发布新数据集,

引言&#xff1a;对话系统中的主题跟随能力的重要性 在构建对话系统时&#xff0c;确保系统能够紧扣主题并正确响应用户的需求是至关重要的。随着人工智能技术的发展&#xff0c;语言模型&#xff08;Language Models, LLMs&#xff09;在对话系统中的应用变得越来越广泛。然而…

学习记录695@EasyExcel 读取数据每一行都为null

原代码 import lombok.Data; import lombok.experimental.Accessors;Data public class ExcelData{/*** createtime*/ExcelProperty(value "姓名")private String name;/*** updatetime*/ExcelProperty(value "班级")private String class; }String fil…

torch中tensor的in-place操作

运行一些操作可能会导致为新结果分配内存。例如&#xff0c;如果我们用Y X Y&#xff0c;我们将取消引用Y指向的张量&#xff0c;而是指向新分配的内存处的张量。 在下面的例子中&#xff0c;我们用Python的id()函数演示了这一点&#xff0c;它给我们提供了内存中引用对象的确…

[Android] build.gradle.kts SigningConfig with name ‘myConfig‘ not found

SigningConfig with name ‘myConfig’ not found. 今天在写 build.gradle.kts 文件的时候&#xff0c;通过 getByName 一直提示 SigningConfig with name myConfig not found&#xff0c; 但通过 signingConfigs.findByName 返回 null println(“signingConfigs myConfig”…

PC-3000 Mobile Pro: 智能手机及平板设备数据提取及取证工具

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设…