• 归并排序的两个版本实现代码


    版本一:参考《大话数据结构》中的代码实现。

    #define MAXSIZE 10

    void merging(int* source,int* result, int start, int middle, int end)
    {
        int i,j,k;
       k=start,i=start,j=middle+1;
        while(i<=middle && j<=end)
        {
            if(source[i]<=source[j])
                result[k++]=source[i++];
            else
                result[k++]=source[j++];
        }
        while(i<=middle)
            result[k++]=source[i++]; //注意,此处的result的角标k就已经对应于

        while(j<=end)                         //最终的角标位置。
            result[k++]=source[j++];
    }

    void MSort(int*source, int start, int end, int* result)
    {
        int middle;
        int* temp=(int*)malloc(MAXSIZE*sizeof(int)); //此处说明在递归函数内部是可以申请动态内存的。
        if(start==end)
            result[start]=source[start];
        else //if(start<end)
        {
            middle = (start+end)/2;
            MSort(source,start,middle,temp);//必须要有temp这个中间变量,否则会导致数值赋值混乱。
            MSort(source,middle+1,end,temp);
            merging(temp,result,start,middle,end);
        }
        free(temp);
    }

    bool MergeSort(int* source, int length)
    {
        if(NULL==source)
            return false;   
        MSort(source,0,MAXSIZE-1,source);
        return true;
    }

    该版本代码存在的两个主要缺点:

    (1)需要事先确定数组的大小MAXSIZE;(2)在递归函数需要不断地开辟空间temp,资源占用较多。

    版本二:改进了temp的取法,充分利用了资源。

    参考博文http://blog.csdn.net/morewindows/article/details/6678165

    //将有二个有序数列a[first...mid]和a[mid...last]合并。
    void mergearray(int a[], int first, int mid, int last, int temp[])
    {
        int i = first, j = mid + 1;
        int m = mid,   n = last;
       
    int k = 0;
        while (i <= m && j <= n)
        {
            if (a[i] <= a[j])
                temp[k++] = a[i++];
            else
                temp[k++] = a[j++];
        }
        while (i <= m)
            temp[k++] = a[i++];
        while (j <= n)
            temp[k++] = a[j++];
        for (i = 0; i < k; i++)
            a[first + i] = temp[i];
    }
    void mergesort(int a[], int first, int last, int temp[])
    {
     
      if (first < last)
        {
            int mid = (first + last) / 2;
            mergesort(a, first, mid, temp);    //左边有序
            mergesort(a, mid + 1, last, temp); //右边有序
            mergearray(a, first, mid, last, temp); //再将二个有序数列合并
        }
    }

    bool MergeSort(int a[], int n)
    {
        int *p = new int[n];
        if (p == NULL)
            return false;
        mergesort(a, 0, n - 1, p);
        delete[] p;
        return true;
    }

  • 相关阅读:
    网络基础、多线程、ftp任务铺垫
    文件上传下载、socketserver(并发)、解读socketserver源码
    模拟ssh、黏包、hashlib模块(MD5)
    面向对象多继承(C3算法)/网络编程
    Slideout吐槽
    HDU 1756 Cupid's Arrow 判断点在多边形的内部
    POJ 1584 A Round Peg in a Ground Hole 判断凸多边形,判断点在凸多边形内
    位运算 找出给定的数中其他数都是两个,有两个是一个的数
    NYOJ 1107 最高的奖励(贪心+优先队列)
    POJ 2653 Pick-up sticks (判断线段相交)
  • 原文地址:https://www.cnblogs.com/jiayouwyhit/p/3211842.html
Copyright © 2020-2023  润新知