谁能解释为什么我的Merge Sort无效?

时间:2015-04-10 00:07:17

标签: c arrays sorting recursion mergesort

任何人都可以解释为什么这不起作用?我无法将数组中的数字排序并放入空b数组中。我已经搜索过高低,但似乎有些东西让我不能,我的同伴cod3rz!

#include <stdio.h>
#include <string.h>

void merge(int array[], int low, int mid, int high);
void midpoint(int array[], int low, int high);

int main(int argc, const char * argv[]){

    int b[100];

    int array[] = { 13, 23, 37, 45, 55, 68, 79, 93};
    int arrayLength = sizeof(array)/sizeof(array[0]);


    for (int i =0 ; i < arrayLength; i++){
        for ( int j= 1 + i ; j < arrayLength; j++){

            midpoint(&array[i], i ,j );{

            }
        printf("%d\n", *b);
        }
    }

    return 0;
}


void merge(int array[], int low, int mid, int high)
{
    int b[100];
    int b[100];
    int i = low;
    int b[100];
    int j = mid + 1;
    int b[100];
    int k = 0;

    while (i <= mid && j <= high) {
        if (array[i] <= array[j])
            b[k++] = array[i++];
        else
            b[k++] = array[j++];
    }
    while (i <= mid)
        b[k++] = array[i++];

    while (j <= high)
        b[k++] = array[j++];

    k--;
    while (k > 0) {
        array[low + k] = b[k];
        k --;
    }

}

void midpoint(int array[], int low, int high)
{
    int mid;
    if (low < high) {
        mid = (high + low)/2;
        midpoint(array, low, mid);
        midpoint(array, mid + 1, high);
        merge(array, low, mid, high);
    }

}

1 个答案:

答案 0 :(得分:1)

首先,您没有将b数组传递给递归调用,因此无法填充它。 此外,您应该能够在助手数组的帮助下在array中就地进行排序,这有助于合并操作。 因此,最高级别不需要b

您的merge()功能有点逆转。您应该做的是最初将整个array数组复制到temp b数组中,然后从b合并到array

这样,当算法完成后,array将在顶层排序,然后你就有了排序的数组。

另外,删除嵌套的for循环。由于MergeSort是一种递归的分而治之算法,你应该从对midpoint()的一次调用开始,如果正确实现,递归将处理其余的。

所以这个:

 for (int i =0 ; i < arrayLength; i++){
        for ( int j= 1 + i ; j < arrayLength; j++){

            midpoint(&array[i], i ,j );{

        }
        printf("%d\n", *b);
    }

应该就是这样:

 midpoint(array, 0 ,arrayLength-1 );

此外,您有一个支架问题,从此行取出开口支架,并根据需要清理关闭支架:

midpoint(&array[i], i ,j );{

编辑:除了我上面概述的内容之外,实际上还有很多问题。 我对你的答案犹豫不决,因为这可能是一项学校作业,但是既然你做了很多努力,而且你的一般代码结构几乎是正确的,那就不是你能做到的了。在网上搜索并找到类似的解决方案,我会继续发布这个。

这是一个可以正确实现基于代码的MergeSort算法的工作解决方案:

#include <stdio.h>
#include <string.h>

void merge(int *array, int low, int mid, int high);
void midpoint(int *array, int low, int high);

int main(int argc, const char * argv[]){

    int array[] = { 100, 13, 44, 23, 22, 37, 3, 45, 2, 55, 68, 1, 79, 93, 4};
    int arrayLength = sizeof(array)/sizeof(array[0]);

    //start the recursive calls
    midpoint(array, 0 ,arrayLength-1 );

    int i;
    for (i = 0; i < arrayLength; i++ ){
        printf("%d\n", array[i]);
    }

    return 0;
}


void merge(int *array, int low, int mid, int high)
{
    int b[100];

    //copy the current elements into temp array
    int v;
    for (v = low; v <= high; v++){
        b[v] = array[v];
    }

    int i = low;
    int j = mid + 1;
    int k = low;

    //merge left side and right side into array in sorted order
    while (i <= mid && j <= high) {
        if (b[i] <= b[j])
            array[k++] = b[i++];
        else
            array[k++] = b[j++];
    }

    //The left side might have left-over elements
    while (i <= mid)
        array[k++] = b[i++];


}

void midpoint(int *array, int low, int high)
{
    int mid;
    if (low < high) {
        mid = (high + low)/2;
        midpoint(array, low, mid);
        midpoint(array, mid + 1, high);
        merge(array, low, mid, high);
    }

}

输出:

1
2
3
4
13
22
23
37
44
45
55
68
79
93
100