归并排序(基本思想以及算法实现)

1、算法思想:

归并排序是简历在归并操作上的一种有效的排序算法,该算法的递归实现方式是采用分治法的一个典型的应用,它是一个稳定的排序算法,其时间复杂度为O(N*logN),空间复杂度为O(N).

在介绍其具体实现之前,我们先来回忆下如何将两个有序序列合并的问题(http://blog.csdn.net/qiyingrunhua/article/details/13276833).该算法可简写成以下形式:

//将有序数组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++];  
} 

二路归并排序的思想是假定排序表有n个元素,则可以看作n个有序表,每个子表的长度为1,然后两两归并,得到n/2个长度为2的有序表,再进行两两归并……如此重复,直到合并成一个长度为n的有序表为止.

2、算法实现

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++];  //temp[]暂存排序后的数组,寻找较小的数写入并后移
        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++)      //上面的功能是合并2个有序序列
        a[first + i] = temp[i];  //将temp写回写回原序列
}  
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;  
} 

(以上算法参考
MoreWindows之博客)

    原文作者:排序算法
    原文地址: https://blog.csdn.net/qiyingrunhua/article/details/13629141
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞