合并在C编译中排序,但不排序

时间:2011-02-06 04:52:29

标签: c recursion merge logic mergesort

我制作了这个程序来对数组进行排序。它工作正常,但它不会排序!请帮我在逻辑中找到错误。感谢

[更新]它能够工作!我刚刚按照下面的建议放下了i,j和k.Also,from i

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

void mergesort(int[], int, int);
void merge(int [], int low, int mid, int hi); //function prototype

int main()
{
    int arr[]={1,4,78,92,9};
    mergesort(arr,0,5);
    //after mergesort
    for(int i=0; i<5; i++)
    {
        printf("%d, ", arr[i]);
    }
    system("pause");
    return 0;
}

void mergesort(int aptr[], int low, int hi)
{
    int mid =0;
    int rightmax=0;
    int leftmax=0;

    if(low==hi)
    {
        return;
    }
    mid=(low+hi)/2;
    mergesort(aptr, low, mid);
    mergesort(aptr, mid+1, hi);
    merge(aptr, low, mid, hi);
}

void merge(int aptr[], int low, int mid, int hi)
{
    int j, i, k;

    //copy contents of aptr to auxiliary b 
    for(i=low; i<=hi; i++)
    {
        bptr[i]=aptr[i]; 
    }

    // iterate through b as if they were still two arrays, lower and higher
    //copy smaller elements first
    i=low;
    j=mid+1;
    k=low;

    while(i<= mid && j<=hi)
    {
        if(bptr[i]<=bptr[j])//<--put smaller element first
        {
            aptr[k++]=bptr[i++];
        }
        else
        {
            aptr[k++]=bptr[j++];
        }
    } 
    // copy back first half just in case
    while(i<=mid)
    {
        aptr[k++]=bptr[i++];
    }
   }//function

3 个答案:

答案 0 :(得分:2)

当程序执行时,语句i<= mid && j<=hi永远不会成立,因此,永远不会输入依赖于它的while循环,并且永远不会到达实际交换元素的代码。

在其前面的for循环后,i等于hi,其始终大于mid。我猜你的意思是在输入i循环之前将low重置为while

答案 1 :(得分:1)

以下是如何启动的建议:将printf()调用放入mergesort()和merge()函数,这些函数在每个函数调用的开始和返回时显示参数。这可能会帮助你弄清楚发生了什么。要求其他人调试你的算法不会帮助你学习如何编程。

答案 2 :(得分:0)

作为一个不错的观点,我想提一下,你已经成为可能整数溢出错误的受害者:

mid=(low+hi)/2;

如果low和/或hi足够大,low + hi会溢出,为mid提供错误的值。相反,你应该这样做:

mid = low + (hi - low) / 2;