美文网首页C++部落
C++中级算法第六天(归并算法)

C++中级算法第六天(归并算法)

作者: 权的小树洞 | 来源:发表于2019-03-20 19:42 被阅读0次

归并算法解释:

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
实现功能的代码如下

#include<iostream>

using namespace std;

void print(int a[], int n) {

    for (int j = 0; j < n; j++) {
        cout << a[j] << "  ";
    }

    cout << endl;
    return;
}

/*合并arr的左右两部分: arr[l..m] 和 arr[m+1..r]  */
void merge(int arr[], int l, int m, int r)
{
    int i, j, k;
    int n1 = m - l + 1;
    int n2 = r - m;

    int L[n1], R[n2];

    /* 复制数据到 L[] 和 R[] */
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j <= n2; j++)
        R[j] = arr[m + 1 + j];

    /* 将两部分再合并到 arr[l..r]*/
    i = 0;
    j = 0;
    k = l;
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            arr[k] = L[i];
            i++;
        }
        else
        {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    /* 复制剩下的部分 L[] */
    while (i < n1)
    {
        arr[k] = L[i];
        i++;
        k++;
    }

    /* 复制剩下的部分 R[] */
    while (j < n2)
    {
        arr[k] = R[j];
        j++;
        k++;
    }
}

/* 对数据arr排序,从l到r */
void mergeSort(int arr[], int l, int r)
{
    if (l < r) {

        //和 (l+r)/2 一样, 但是可以避免溢出当l和r较大时
        int m = l + (r - l) / 2;
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);
        merge(arr, l, m, r);
    }

    return;
}

int main() {

    int a[8] = { 5,1,2,3,7,4,8,6 };
    int i, b[8];

    mergeSort(a, 0, 7);

    print(a, 8);

    return 0;
}

相关文章

网友评论

    本文标题:C++中级算法第六天(归并算法)

    本文链接:https://www.haomeiwen.com/subject/fqatvqtx.html