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

/***********************************************************************************************
1.设定两个指针,最初位置分别为两个已经排序序列的起始位置
2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
3.重复步骤3直到某一指针达到序列尾
4.将另一序列剩下的所有元素直接复制到合并序列尾
归并排序:
归并排序具体工作原理如下(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素
2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素
3.重复步骤2,直到所有元素排序完毕

归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间.


归并排序法(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;

}

    原文作者:排序算法
    原文地址: https://blog.csdn.net/wangshihui512/article/details/8828808
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞