读书人

分治法MergerSort函数里的递归小弟我实

发布时间: 2012-04-26 14:01:31 作者: rapoo

分治法MergerSort函数里的递归我实在是不清楚 大家帮我下 讲下过程
MergerSort函数里的递归我实在是不清楚

C/C++ code
#include <iostream>#include <conio.h>#include <malloc.h>using namespace std;const int array_size = 5;void Merger(int A[], int p, int q, int r); // void Merger(int * A, int p, int q, int r);void MergerSort(int A[], int p, int r); // void MergerSort(int * A, int p, int r);// p为数组A第一个元素位置 r为数组A最后一个元素位置int main(){    int A[array_size] = {0,4,2,3,1};    int i = 0;    MergerSort(A, 0, array_size-1);    for (int i = 0; i < array_size; i++)    {        cout << A[i] << " ";    }        getch();    return 0;}//p为数组A第一个元素位置 r为数组A最后一个元素位置void MergerSort(int A[], int p, int r) // void MergerSort(int * A, int p, int r)  就是这里的{        int mid = 0;        if (p < r)        {                mid = (r + p) / 2;                MergerSort(A, p, mid);                MergerSort(A, mid + 1, r);                 Merger(A, p, mid, r);        }} // p为数组A第一个元素位置 r为数组A最后一个元素位置 q为数组A中间位置void Merger(int A[], int p, int q, int r) // void Merger(int * A, int p, int q, int r){                                   int n1 = q - p + 1;    int n2 = r - q ;    int i = 0, k = 0, j = 0;        int L[n1 + 1]; // int * L = (int *)malloc(sizeof(int) * n1 + 1);    int R[n2 + 1]; // int * R = (int *)malloc(sizeof(int) * n2 + 1);    for (i = 0; i < n1; i++)    {        L[i] = A[p + i];    }    for (i = 0; i < n2; i++)    {        R[i] = A[q + i + 1];    }    i = j = 0;        for (k = p; k <= r; k++)    {        if ((i < n1 && j == n2) || (i < n1 && j < n2 && L[i] < R[j]))             A[k] = L[i++];        else if ((i == n1 &&j < n2) || (i < n1 && j < n2 && L[i] >= R[j]))             A[k] = R[j++];    }    // free(L);    // 清理L之前申请的内存    // free(R);    // 清理L之前申请的内存}


[解决办法]
C/C++ code
void MergerSort(int A[], int p, int r) // void MergerSort(int * A, int p, int r)  就是这里的{        int mid = 0;        if (p < r)        {                mid = (r + p) / 2;                MergerSort(A, p, mid);     // 对原问题的左边一半递归求解                MergerSort(A, mid + 1, r); // 对原问题的右边一半递归求解                Merger(A, p, mid, r);      // 这时,左边一半有序,右边一半也有序,将两个有序的子序列合并        }} void Merger(int A[], int p, int q, int r) // 将两段有序的子序列合并{ // ...}// 还不理解的话就翻翻书吧,看书比上网求助收获会更大 

读书人网 >C++

热点推荐