zoukankan      html  css  js  c++  java
  • 归并排序————数据结构课程

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

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

    现将长度为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;
    }
    归并排序
  • 相关阅读:
    MySQL + Atlas --- 部署读写分离(实现,其他的技术有参考文档)
    基于Redis、Storm的实时数据查询实践
    Redis 配置
    Redis 安装
    redis简介
    Java-Enumeration总结
    spring源码剖析(四)自定义标签解析流程
    svn 把主干合到分支 分支合到主干
    关于Class.getResource和ClassLoader.getResource的路径问题
    instanceof, isinstance,isAssignableFrom的区别
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/15719494.html
Copyright © 2011-2022 走看看