归并排序————数据结构课程
归并排序是一个稳定的排序算法
核心思路为:不断地将两个有序序列合并为一个更长的有序序列
现将长度为1的相邻子序列合并,然后长度为2的,长度为4的,直到整个序列被合并。

#include<iostream> #include<cstdio> #include<cmath> #include<malloc.h> using namespace std; #define RecType int void disp(int R[],int n) { for(int i=1; i<=n; i++) printf("%d ",R[i]); printf("\n"); } void Merge(RecType R[],int low,int mid,int high) {//对给定的相邻两段序列进行归并 RecType *R1; int i=low,j=mid+1,k=0; //k是R1的下标,i、j分别为第1、2段的下标 R1=(RecType *)malloc((high-low+1)*sizeof(RecType));//临时储存排好的序列 while (i<=mid && j<=high)//从两个系列中,找较小的元素放入暂存系列中 if (R[i]<=R[j]) { //将第1段中的记录放入R1中 R1[k]=R[i]; i++; k++; } else { //将第2段中的记录放入R1中 R1[k]=R[j]; j++; k++; } while (i<=mid) { //将第1段余下部分复制到R1 R1[k]=R[i]; i++; k++; } while (j<=high) { //将第2段余下部分复制到R1 R1[k]=R[j]; j++; k++; } for (k=0,i=low; i<=high; k++,i++) //将R1复制回R中 R[i]=R1[k]; free(R1); return ; } void MergeSort(RecType R[],int n) {//不断的将相邻子序列,两两合并 int length; for (length=1; length<n; length=2*length) { int i; for (i=1; i+2*length-1<=n; i=i+2*length) //归并length长的两相邻子表 Merge(R,i,i+length-1,i+2*length); if (i+length-1<n) //余下两个子表,后者长度小于length Merge(R,i,i+length-1,n); //归并这两个子表 } return ; } int main() { RecType R[]={9,1,4,3,5,0,2,6,8,7}; int n=9; disp(R,n); MergeSort(R,n); disp(R,n); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App