归并排序

原创 2016年06月01日 16:58:51

1.归并排序的概念

  • 将待排序元素分成两个区间,用递归思想将两个区间进行排序。
  • 将 两个排好的有序区间的元素进行合并。

2.归并排序的思想

  • 分治思想
  • 递归思想(区间的不断缩小)

3.归并排序的的实现


3.1先从简单的合并开始

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

3.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++];  
        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++)  
        a[first + i] = temp[i];  
} 

3.3 对整个待排序元素进行分割,然后合并。

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); //再将二个有序数列合并  
    }  
}  

3.4 主函数,以及待排序元素的输入解决

bool MergeSort(int a[], int n)  
{  
    int *p = new int[n];  //int *p =(int *) malloc(sizeof(int)*n);
    if (p == NULL)  
        return false;  
    mergesort(a, 0, n - 1, p);  
    delete[] p;  
    return true;  
}  

参考

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)