zoukankan      html  css  js  c++  java
  • 归并排序,递归法,C语言实现。

    利用归并排序法对序列排序的示意图(递归法):

    一、算法分析:利用递归的分治方法:1、将原序列细分,直到成为单个元素;2、在将分割后的序列一层一层地按顺序合并,完成排序。细分通过不断深入递归完成,合并通过递归   一层层返回完成。

    二、C语言代码

      1、完成排序的三个函数

    void MergeSort(int l[],int lenght)
    {
        int tmp[lenght];
    
        MSort(l,tmp,1,lenght);
    }
    
    /*分:MSort将原来的序列不断细分,直到为1,再由Merge归并*/
    void MSort(int l[],int tmp[],int left,int right)
    {
        int mid;
    
        if(left!=right)
        {
            mid=(left+right)/2;     //将待排序序列分成两部分
            MSort(l,tmp,left,mid);      //将左边排序
            MSort(l,tmp,mid+1,right);       //将右边排序
            Merge(l,tmp,left,mid,right);        //将已排序的两部分合并
        }
    }
    
    /*数组tmp只是作为临时存储,归并后,再将有序的数组拷贝到原来的l中*/
    void Merge(int l[],int tmp[],int left,int mid,int right)
    {
        int i,j,t;
    
        for(i=left,j=mid+1,t=left;i<=mid&&j<=right;t++)
        {
            if(l[i]<=l[j])
            {
                tmp[t]=l[i];
                i++;
            }
            else
            {
                tmp[t]=l[j];
                j++;
            }
        }
        /*归并的两个序列不一样长时,将剩余的元素加入tmp*/
        if(i<=mid)
        {
            for(;i<=mid;i++)
            {
                tmp[t]=l[i];
                t++;
            }
        }
        if(j<=right)
        {
            for(;j<=right;j++)
            {
                tmp[t]=l[j];
                t++;
            }
        }
        /*将归并后的有序序列拷贝到原数组*/
        for(t=left;t<=right;t++)
        {
            l[t]=tmp[t];
        }
    }

    使用时,调用MergeSort函数就行了

    下面是我写的一个测试代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    #define NUM 5000
    
    void MergeSort(int l[],int length);
    void MSort(int l[],int tmp[],int left,int right);
    void Merge(int l[],int tmp[],int left,int mid,int right);
    
    int main()
    {
        int i,a[NUM+1];
    
        srand((unsigned)time(NULL));
        /*a[0]作为哨兵单元,不在随机数生成之列*/
        for(i=1;i<=NUM;i++)
        {
            a[i]=rand();
        }
        /*printf("Befor sort:");
        for(i=1;i<=NUM;i++)
        {
            printf("%d ",a[i]);
        }*/
    
        MergeSort(a,NUM);
    
        printf("
    After sort:");
        for(i=1;i<=NUM;i++)
        {
            printf("%d ",a[i]);
        }
    
        return 0;
    }
    
    void MergeSort(int l[],int lenght)
    {
        int tmp[lenght];
    
        MSort(l,tmp,1,lenght);
    }
    
    /*分:MSort将原来的序列不断细分,直到为1,再由Merge归并*/
    void MSort(int l[],int tmp[],int left,int right)
    {
        int mid;
    
        if(left!=right)
        {
            mid=(left+right)/2;     //将待排序序列分成两部分
            MSort(l,tmp,left,mid);      //将左边排序
            MSort(l,tmp,mid+1,right);       //将右边排序
            Merge(l,tmp,left,mid,right);        //将已排序的两部分合并
        }
    }
    
    /*数组tmp只是作为临时存储,归并后,再将有序的数组拷贝到原来的l中*/
    void Merge(int l[],int tmp[],int left,int mid,int right)
    {
        int i,j,t;
    
        for(i=left,j=mid+1,t=left;i<=mid&&j<=right;t++)
        {
            if(l[i]<=l[j])
            {
                tmp[t]=l[i];
                i++;
            }
            else
            {
                tmp[t]=l[j];
                j++;
            }
        }
        /*归并的两个序列不一样长时,将剩余的元素加入tmp*/
        if(i<=mid)
        {
            for(;i<=mid;i++)
            {
                tmp[t]=l[i];
                t++;
            }
        }
        if(j<=right)
        {
            for(;j<=right;j++)
            {
                tmp[t]=l[j];
                t++;
            }
        }
        /*将归并后的有序序列拷贝到原数组*/
        for(t=left;t<=right;t++)
        {
            l[t]=tmp[t];
        }
    }
  • 相关阅读:
    php ajax分页的例子,在使用中
    PHP远程文件管理,可以给表格排序,遍历目录,时间排序
    背景变暗的div可拖动提示窗口,兼容IE、Firefox、Opera
    CSS简洁的左侧菜单(侧拉菜单,向右显示)
    无间断循环滚动(兼容IE、FF)
    poj 1007 求逆序数
    poj 1775 简单搜索
    面向对象之继承和组合浅谈
    在flex中导入fl包
    C99中包括的特性
  • 原文地址:https://www.cnblogs.com/xmkk/p/3311408.html
Copyright © 2011-2022 走看看