zoukankan      html  css  js  c++  java
  • 归并排序的两个版本实现代码

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

    #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;
    }

  • 相关阅读:
    辣条君写爬虫1【贝壳房价爬取】
    如何在 Windows 上创建一个新的 GPG key
    Protocol Buffers 开发者指南
    Docsify 的边栏目录如何设置
    Docker 容器的网络
    Discourse 如何添加 Google Analytics GA4 代码
    Docker 引擎
    Docker 引擎
    Docker 引擎
    Docker 引擎概述
  • 原文地址:https://www.cnblogs.com/jiayouwyhit/p/3211842.html
Copyright © 2011-2022 走看看