归并排序

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

 

//将有序数组a[]和b[]合并到c[]中
void MemeryArray(int a[], int n, int b[], int m, int c[])
{
    int i, j, k;

    i = j = k = 0;
    while (i < n && j < m)
    {
        if (a[i] < b[j])
            c[k++] = a[i++];
        else
            c[k++] = b[j++]; 
    }

    while (i < n)
        c[k++] = a[i++];

    while (j < m)
        c[k++] = b[j++];
}

 

void Merge(int src[], int des[], int low, int mid, int high)
{
    int i = low;
    int j = mid + 1;
    int k = low;

    while( (i <= mid) && (j <= high) ) //将小的放到目的地中
    {
        if( src[i] < src[j] )
        {
            des[k++] = src[i++];
        }
        else
        {
            des[k++] = src[j++];
        }
    }

    while( i <= mid )  //若还剩几个尾部元素
    {
        des[k++] = src[i++];
    }

    while( j <= high ) //若还剩几个尾部元素
    {
        des[k++] = src[j++];
    }
}

//每次分为两路 当只剩下一个元素时,就不需要在划分
void MSort(int src[], int des[], int low, int high, int max)
{
    if( low == high ) //只有一个元素,不需要归并,结果赋给des[low]
    {
        des[low] = src[low]; 
    }
    else //如果多个元素,进行两路划分
    {
        int mid = (low + high) / 2;
        int* space = (int*)malloc(sizeof(int) * max);

        //递归进行两路,两路的划分 
        //当剩下一个元素的时,递归划分结束,然后开始merge归并操作
        if( space != NULL )
        {
            MSort(src, space, low, mid, max); 
            MSort(src, space, mid+1, high, max);
            Merge(space, des, low, mid, high); //调用归并函数进行归并
        }

        free(space);
    }
}

void MergeSort(int array[], int len) // O(n*logn)
{
    MSort(array, array, 0, len-1, len);
}

int main()
{
    
    //int array[] = {21, 25, 49, 25, 16, 8};
    int array[] = {21, 25};
    int len = sizeof(array) / sizeof(*array); 
    printArray06(array, len);
    MergeSort(array, len);
    printArray06(array, len);
    system("pause");
    return 0;
}

 

posted @ 2016-05-25 18:04  小司机  阅读(145)  评论(0编辑  收藏  举报