首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MergeSort递归

MergeSort递归
EN

Stack Overflow用户
提问于 2021-09-10 12:24:00
回答 1查看 52关注 0票数 0
代码语言:javascript
复制
// main function 
void mergeSort(int input[],int size){ // 
    if(size == 0 || size == 1) return;  //base case
    int m = size/2; //finding the mid 
    mergeSort(helper(input,0,m),m);  //left array
    mergeSort(helper(input,m,size),size-m);  // right array
    merge(input,0,m,size); // merging the both arrays
}

void merge(int *input,int start,int size1,int size) //merging array in increasing order
{
    int a[size];
    int i=start,j=size1,k=0;
    while(i < size1 && j < size){
        if(input[i] < input[j]){
            a[k++] = input[i++];
        }
        else{
            a[k++] = input[j++];
        }
    }
    while(i < size1){
        a[k++] = input[i++];
    }
    while(j < size){
        a[k++] = input[j++];
    }
    for(int i=0;i<size;i++){
        input[i] = a[i];
    }
}
int* helper(int input[],int s,int e){// this function helps get the half array
    int a[e-s];
    for(int i=s,j=0;i<e;i++,j++){
        a[j] = input[i];
    }
    for(int i=0;i<e-s;i++){
        input[i] = a[i];
    }
    return input;
}

我无法调试这段代码,任何人都能告诉我为什么这不对,我在助手函数的帮助下将两者分开,然后将其传递给合并以获得输出。

EN

回答 1

Stack Overflow用户

发布于 2021-09-10 13:57:34

这是一个完整的合并排序算法。

首先,定义一个函数将给定的数组拆分为两个子数组,然后将它们合并回排序。

代码语言:javascript
复制
void merge(int *array, int start, int mid, int end)
{
    // 1. Split array into two subarrays: left and right
    const int left_size = mid - start + 1;
    const int right_size = end - mid;

    int left_subarray[left_size];
    int right_subarray[right_size];

    int i;
    for (i = 0; i < left_size; i++)
        left_subarray[i] = array[start + i];

    int j;
    for (j = 0; j < right_size; j++)
        right_subarray[j] = array[mid + 1 + j];

    // 2. Merge them sorted into array
    i = 0; j = 0;
    int k;
    for (k = start; i < left_size && j < right_size; k++) {
        if (left_subarray[i] <= right_subarray[j])
            array[k] = left_subarray[i++];
        else
            array[k] = right_subarray[j++];
    
    }

    for (; i < left_size; i++)
        array[k++] = left_subarray[i];

    for (; j < right_size; j++)
        array[k++] = right_subarray[j];
}

merge()的第一部分解释了如何将数组拆分为两个子数组。现在可以使用递归对数组进行合并排序:

代码语言:javascript
复制
void merge_sort(int *array, int start, int end)
{
    if (start >= end)
        return;

    int mid = start + (end - start) / 2;

    merge_sort(array, start, mid);
    merge_sort(array, mid + 1, end);

    merge(array, start, mid, end);
}

您可以定义一个函数来帮助您打印数组:

代码语言:javascript
复制
void print_array(int *array, int size, const char *sep)
{
    int i;
    for (i = 0; i < size; i++)
        printf("%d%s", array[i], sep);

    printf("\n");
}

下面是一个示例程序:

代码语言:javascript
复制
int main()
{
    int array[] = {9, 6, 8, 7, 5, 4, 0, 3, 2, 1};
    const int size = sizeof(array) / sizeof(*array);

    printf("Unsorted array:\t");
    print_array(array, size, " ");
    
    merge_sort(array, 0, size-1);
    
    printf("Sorted array:\t");
    print_array(array, size, " ");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69132150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档