归并排序

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

算法时间复杂度 
       最好的情况下:一趟归并需要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;
}
原文地址:https://www.cnblogs.com/neverleave/p/2952686.html