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

标签 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。此函数递归调用自身,直到 low 小于 high。然后对子数组进行合并操作。这是在函数合并中实现的,其中将原始数组的第一个元素复制到辅助数组,然后执行合并操作。这工作正常,生成的排序数字将存储在原始数组中。

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

-谢谢

最佳答案

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

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

关于c - 将合并操作的结果直接复制到辅助数组时,合并排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20807067/

相关文章:

javascript - 用另一个数组更新一个数组(删除和添加值)

javascript - array.push() 不起作用,即使数组对象已明确定义并在范围内

java - 对大量对象进行排序的最有效方法

c - fclose() 导致段错误

c - 搜索字符串 C

c - 包含 unistd.h 的 write() 的包装例程导致错误

Java如何将数组的一个元素与同一数组的所有其他元素进行比较

php - 如何从数组中获取准确的值 - php

PHP MySQL 菜单排序

c++ - #ifndef FILENAME....#endif 在头文件中的用途