zoukankan      html  css  js  c++  java
  • 归并排序

    思想:多次将两个或两个以上的有序表合并成一个新的有序表。

    算法时间复杂度 
           最好的情况下:一趟归并需要n次,总共需要logN次,因此为O(N*logN) 
           最坏的情况下,接近于平均情况下,为O(N*logN) 
           说明:对长度为n的文件,需进行logN 趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。

    稳定性 
          归并排序最大的特色就是它是一种稳定的排序算法。归并过程中是不会改变元素的相对位置的。 
    缺点是,它需要O(n)的额外空间。但是很适合于多链表排序。(可以去看我博客中两个排序链表的合并)

    //将【first...mid】【mid....last】两个有序数组合并
    void mergearray(int data[], int first, int mid, int last, int temp[])
    {
    
        int arr1 = first; //指向第一个数组的开头
        int arr2 = mid+1;//指向第二个数组的开头
        int endofarr1 = mid;//指向第一个数组的结尾
        int endofarr2 = last;//指向第二个数组的结尾
        int k=0;//temp数组指针
    
        while( arr1 <= endofarr1 && arr2 <= endofarr2)
        {
            if( data[arr1] < data[arr2] )
            {
                temp[k] = data[arr1];
                ++k;
                ++arr1;
                //简写成temp[k++] = data[arr1++];
            }
            else
                temp[k++] = data[arr2++];
        }
        //如果arr2数组先遍历完成,就继续遍历完arr1
        while(arr1 <= endofarr1)
            temp[k++] = data[arr1++];
        //如果arr1数组先遍历完成,就继续遍历完arr2
        while(arr2 <= endofarr2)
            temp[k++] = data[arr2++];
    
        for(int i=0;  i< k ; ++i)
        {
            data[first+i] = temp[i]; //注意这里要把first加进去
        }
    }
    
    void mergesort(int data[], int first, int last, int temp[])
    {
        if( first < last)
        {
            int mid = (first+last)/2;
            mergesort(data,first,mid,temp);
            mergesort(data,mid+1,last,temp);
            mergearray(data,first,mid,last,temp);
        }
    }
    
    bool Mergesort(int data[], int length)
    {
        if(data == NULL || length <=0 )
            return false;
        
        int * temp = new int[length];
        if( temp == NULL )
            return false;
    
        mergesort(data,0,length-1,temp);
        delete[] temp;
        return true;
    }
  • 相关阅读:
    myshop-dubbo 版图床
    Dockerfile里执行RUN chown 不起作用?
    The currently defined JAVA_HOME (/usr/local/openjdk-11) refers to a location where java was found but jstack was not found
    随机森林
    K-mean和K-mean++
    机器学习之特征选择
    聚类---度量
    机器学习之降维方法
    机器学习之生成模型和判别模型
    EM相关两个算法 k-mean算法和混合高斯模型
  • 原文地址:https://www.cnblogs.com/neverleave/p/2952686.html
Copyright © 2011-2022 走看看