将合并操作的结果直接复制到辅助数组时,合并排序不起作用

时间:2013-12-27 20:01:50

标签: c arrays sorting mergesort

以下是我用于合并排序的代码

#include<stdio.h>
#include<stdlib.h>

int merge(int *arr,int *b,int low,int mid,int high)
{
    int i,j,k;
    i = low;
    j = mid+1;

//  printf("low: %d mid: %d high: %d\n",low,mid,high);
    for(k=low;k<=high;k++)
    {
        b[k] = arr[k];
    }
    k = low;
    while((i <= mid) && (j <= high))
    {
        if(b[i] <= b[j])
        {
            arr[k++] = b[i++];
        }
        else
        {
            arr[k++] = b[j++];
        }
    }
    while(i<=mid)
        arr[k++] = b[i++];
    while(j<=high)
        arr[k++] = b[j++];
}

int merge_sort(int *arr,int *b,int low,int high)
{
    int mid;
    if(low<high)
    {
        mid = (low)+(high - low)/2;
        merge_sort(arr,b,low,mid);
        merge_sort(arr,b,mid+1,high);
        merge(arr,b,low,mid,high);
    }
    return 0;
}

int temp_merge(int *arr,int *b,int low,int mid,int high)
{
    int i,j,k;
    i = low;
    j = mid+1;
    k = low;

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

int temp_merge_sort(int *arr,int *b,int low,int high)
{
    int mid;
    if(low<high)
    {
        mid = (low)+(high - low)/2;
        temp_merge_sort(arr,b,low,mid);
        temp_merge_sort(arr,b,mid+1,high);
        temp_merge(arr,b,low,mid,high);
    }
    return 0;
}

int main()
{
    int a[100],b[100],i;
    a[0] = 34;
    a[1] = 3;
    a[2] = 14;
    a[3] = 4;
    a[4] = 25;
    a[5] = 67;
    a[6] = 11;
    a[7] = 8;
    a[8] = 12;
    a[9] = 1;
    printf("contents of array a\n");
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    printf("\n");
    merge_sort(a,b,0,9);
    printf("after using merge_sort function\n");
    printf("contents of auxillary array b\n");
    for(i=0;i<10;i++)
        printf("%d ",b[i]);
    printf("\n");
    printf("contents of array a\n");
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    printf("\n");
    a[0] = 34;
    a[1] = 3;
    a[2] = 14;
    a[3] = 4;
    a[4] = 25;
    a[5] = 67;
    a[6] = 11;
    a[7] = 8;
    a[8] = 12;
    a[9] = 1;
    printf("contents of array a after reassigning values\n");
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    printf("\n");
    temp_merge_sort(a,b,0,9);
    printf("after using temp_merge_sort function\n");
    printf("contents of auxillary array b\n");
    for(i=0;i<10;i++)
        printf("%d ",b[i]);
    printf("\n");
    printf("contents of array a\n");
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    printf("\n");
}

我为此代码获得了以下输出

contents of array a
34 3 14 4 25 67 11 8 12 1 
after using merge_sort function
contents of auxillary array b
3 4 14 25 34 1 8 11 12 67 
contents of array a
1 3 4 8 11 12 14 25 34 67 
contents of array a after reassigning values
34 3 14 4 25 67 11 8 12 1 
after using temp_merge_sort function
contents of auxillary array b
34 3 14 4 25 67 11 8 12 1 
contents of array a
34 3 14 4 25 67 11 8 12 1

最初我用数字填充数组。然后我调用了函数merge_sort。此函数递归调用自身,直到低于低。然后在子阵列上执行合并操作。这是在函数合并中实现的,其中原始数组的第一个元素被复制到辅助数组,然后执行合并操作。这样工作正常,生成的排序数字将存储在原始数组中。

之后,我使用未排序的值重新填充原始数组并调用函数temp_merge_sort函数。这与merge_sort函数类似,不同之处在于此合并操作由temp_merge函数执行。在此函数中,不是将原始数组值从低到高复制到辅助数组,而是直接对原始数组的内容执行合并操作,并将结果复制到辅助数组。这不能正常工作,辅助数组的内容保持与原始数组未排序相同。我不明白我错在哪里。有人可以帮忙吗???

- 谢谢你

1 个答案:

答案 0 :(得分:1)

在每次传递中,您将“已排序”元素放在b中;但由于您的代码假设arr中的元素变得越来越分类,您正在执行的操作没有做任何有用的事情(因为您需要从b复制已排序的元素进入arr,或依赖日益排序的b作为进一步排序的数据来源。

鉴于您当前的代码,我无法想到“一线”解决方案 - 但这实际上是您遇到的问题。