• 二路归并排序算法实现-完整C语言程序


    /*********************************************************************************************** 
    1.设定两个指针,最初位置分别为两个已经排序序列的起始位置 
    2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 
    3.重复步骤3直到某一指针达到序列尾 
    4.将另一序列剩下的所有元素直接复制到合并序列尾 
    归并排序: 
    归并排序具体工作原理如下(假设序列共有n个元素): 
    1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素 
    2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素 
    3.重复步骤2,直到所有元素排序完毕 
     
    归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间. 
     何问起 hovertree.com
     
    归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。 
    其主要算法操作可以分为以下步骤:  
    Step 1:将n个元素分成两个含n/2元素的子序列  
    Step 2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)  
    Step 3:合并两个已排序好的序列  
     
    ************************************************************************************************/  
      
    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    #include<cmath>  
    #include<climits>  
    #include<cstdlib>  
    #include<time.h>  
    #include<cstdlib>  
    #include<cstdio>  
    using namespace std;  
    void Random(int a[],int n)  
    {  
        int i=0;  
        srand( (unsigned)time( NULL ) );  
        while(i<n)  
        {  
            a[i++]=rand();  
        }  
    }  
    void merge(int *a, int low, int mid, int high) //归并操作  
    {  
        int k, begin1, begin2, end1, end2;  
        begin1 = low;  
        end1 = mid;  
        begin2 = mid + 1;  
        end2 = high;  
        int *temp = (int *) malloc((high - low + 1) * sizeof(int));  
        for(k = 0; begin1 <= end1 && begin2 <= end2; k++) //自小到大排序  
        {  
            if(a[begin1] <= a[begin2])  
                temp[k] = a[begin1++];  
            else  
                temp[k] = a[begin2++];  
        }  
        if(begin1 <= end1) //左剩  
            memcpy(temp + k, a + begin1, (end1 - begin1 + 1) * sizeof(int));  
        else //右剩  
            memcpy(temp + k, a + begin2, (end2 - begin2 + 1) * sizeof(int));  
        memcpy(a + low, temp, (high - low + 1) * sizeof(int)); //排序后复制到原数组  
        free(temp); //释放空间  
    }  
    void merge_sort(int *a, unsigned int begin, unsigned int end)  
    {  
        int mid;  
        if(begin < end)  
        {  
            mid=begin+(end-begin)>>1;  
            //mid = (end + begin) / 2;  防止数据加法溢出  
            merge_sort(a, begin, mid); //分治  
            merge_sort(a, mid + 1, end); //分治  
            merge(a, begin, mid, end);  //合并两个已排序的数列  
        }  
    }  
    int main()  
    {  
        int a[20];  
        Random(a,20);  
        for(int i=0;i<20;i++)  
        {  
            cout<<" "<<a[i]<<" ";  
        }  
      
        merge_sort(a, 0, 20-1);  
        for(int i=0;i<20;i++)  
        {  
            cout<<" "<<a[i]<<endl;  
        }  
      
        return 0;  
      
    }  

    推荐:http://www.cnblogs.com/roucheng/p/cppjy.html

  • 相关阅读:
    如何自定义一个通信协议
    c++ 如何编写接口类(interface)
    QT国际化(中英转换)
    QT中文乱码与国际化支持
    frp官方中文文档
    K3 LEDE固件更改FRP客户端版本
    Linux下的tar压缩解压缩命令详解
    QT入门系列(3):控制台输出QString
    Delphi、Lazarus保留字、关键字详解
    使用TortoiseSVN的客户端钩子脚本触发Jenkins构建
  • 原文地址:https://www.cnblogs.com/roucheng/p/cerlu.html
Copyright © 2020-2023  润新知