排序算法(八)归并排序

来源:互联网 发布:linux命令文件拷贝到 编辑:程序博客网 时间:2024/06/06 09:27

归并排序是利用归并的思想将一组数据进行排序。它是一种外部排序(可以对那些在磁盘上的大数据进行排序)。下边进行图解。



【代码实现】

//归并排序void Merge(int* a,int begin,int mid,int end,int tmp[]){    int begin1 = begin;    int end1 = mid;    int begin2 = mid+1;    int end2 = end;    int index = 0;    int i = 0;    while(begin1 <= end1 && begin2 <= end2)    {        if(a[begin1] < a[begin2])        {            tmp[index++] = a[begin1++];        }        if(a[begin2] < a[begin1])        {            tmp[index++] = a[begin2++];        }    }    //应该有一个区间没有拷贝完成    while(begin1 <= end1)    {        tmp[index++] = a[begin1++];    }    while(begin2 <= end2)    {        tmp[index++] = a[begin2++];    }    //将tmp数组的内容拷贝到a数组    while(i < index)    {        a[begin + i] = tmp[i];        ++i;    }}void MergeSort(int* a,int begin,int end,int tmp[]){    assert(a && size > 0);    if(begin < end)    {        int mid = begin + (end - begin)/2;        MergeSort(a,begin,mid,tmp);        MergeSort(a,mid + 1,end,tmp);        Merge(a, begin, mid, end, tmp);    }}

时间复杂度:O(N*logN).递归的次数就是logN次,每次遍历N次。
空间复杂度:O(N + logN)。递归深度是logN,辅助的大小为N的tmp数组。关于对磁盘上的数据的排序,前边的文章已经分享过~~可以自行查看。

0 0
原创粉丝点击