归并排序————数据结构课程

归并排序是一个稳定的排序算法

核心思路为:不断地将两个有序序列合并为一个更长的有序序列

现将长度为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;
}
归并排序
复制代码

 

posted @   浪矢-CL  阅读(27)  评论(0编辑  收藏  举报
编辑推荐:
· .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
点击右上角即可分享
微信分享提示