C语言排序系列之归并排序(2)

    归并排序的基本思想是:首先对待排序数组前 n/ 2排序,再对后n / 2排序,然后对两部分进行合并

    流程:1、若n= 1,返回

            2、对前n / 2排序

                对后n / 2 排序

            3、合并

     时间复杂度为:O(nlgn),推导方法见http://v.163.com/special/opencourse/algorithms.html 麻省理工学院开放课 --算法导论(国外的教学真的比国内的好很多)

     

/*归并排序:
  时间复杂度:O(nlgn)
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void MergeSort(int data[],int length)
{
    int *tempdata;
    int i = 0;
    int nHead1 = 0;
    int nHead2 = 0;
    if(length == 1)
    {
        return;
    }
    MergeSort(data,(int)(length / 2));
    MergeSort(data + (int)(length / 2),length - (int)(length / 2));
    tempdata = (int*)malloc(length * sizeof(int));
    nHead1 = 0;
    nHead2 = length / 2;
    for(i = 0;i < length;++i)
    {
        if(nHead2 == length || ((nHead1 < (int)(length / 2)) && data[nHead1] < data[nHead2]))
        {
            tempdata[i] = data[nHead1++];
        }
        else
        {
            tempdata[i] = data[nHead2++];
        }
    }
    memcpy(data,tempdata,length * sizeof(int));
}

int main()
{
    int data[15] = {4,7,2,6,5,9,3,8,19,11,14,12,17,20,18};
    int i = 0;
    MergeSort(data,15);
    for(i = 0;i < 15;i++)
    {
        printf("%d ",data[i]);
    }
    printf("\n");
    getchar();
    return 0;
}
原文地址:https://www.cnblogs.com/renteng/p/2539064.html