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;
    }
  • 相关阅读:
    WPF项目学习.一
    AtCoder Beginner Contest 210 A~D 题解
    P7715 「EZEC-10」Shape 题解
    P6216 回文匹配 题解
    字符串学习笔记
    #2742. 「JOI Open 2016」销售基因链
    树状数组学习笔记
    2021 省选游记
    AtCoder Beginner Contest 196 E
    AtCoder Regular Contest 113 A~D题解
  • 原文地址:https://www.cnblogs.com/neverleave/p/2952686.html
Copyright © 2011-2022 走看看