合并排序 - 代码中的错误

时间:2012-01-03 20:26:27

标签: c sorting

我写了一个接收数组的简短代码并对其进行排序。 这是我的第一次,我有很多错误 - 请尽可能 向我解释如何修复以及在哪里/我的错误是什么...... 我想做的就是对数组进行排序并在排序后打印出来。

#include <stdio.h>

int merge_sort(int *a,int first, int last)
{
    int middle;
    if(first < last)
    {
        middle=(first+last)/2;
        merge_sort(a,first,middle);
        merge_sort(a,middle+1,last);
        merge(a,first,middle,last);
    {
}

void main()
{
    int x[] = {1, 2, 3, 1, 3, 0, 6};
    int xsize= (sizeof x / sizeof x[0])
    merge_sort(x, 0, sizeof x / sizeof x[0]);

    for (int i = 0; i < xsize; i++) { printf("%d ", x[i]); } putchar('\n');
}

1 个答案:

答案 0 :(得分:1)

我可以在程序中看到多个错误

  1. int xsize= (sizeof x / sizeof x[0])最后必须有分号;
  2. for(int i=0;i<xsize;printf("%d ",x[i]), i++);不是打印数组元素的方法。
  3. 您的merge()遗失了 - merge(a,first,middle,last);
  4. 所以我继续编写了这个样本mergesort供您参考。希望这会有所帮助!!

    #include <stdio.h>
    
    /*
    
    NOTE: 
    The mergesort boils downs to this.. 
    Given two sorted array's how do we merge this?
    
    We need a new array to hold the result of merging
    otherwise it is not possible to do it using array, 
    so we may need a linked list
    
    */
    
    void merge(int a[], int i, int j)
    {
        int mid = (i+j)/2;
        int ai = i;
        int bi = mid+1;
    
        int newa[j-i+1], newai = 0;
    
        while(ai <= mid && bi <= j) {
            if (a[ai] > a[bi])
                newa[newai++] = a[bi++];
            else                    
                newa[newai++] = a[ai++];
        }
    
        while(ai <= mid) {
            newa[newai++] = a[ai++];
        }
    
        while(bi <= j) {
            newa[newai++] = a[bi++];
        }
    
        for (ai = 0; ai < (j-i+1) ; ai++)
            a[i+ai] = newa[ai];
    
    }
    
    void mergesort(int a[], int i, int j)
    {
        int mid = (i+j) / 2;
    
        if (i >= j) return;
    
        mergesort(a, i, mid);
        mergesort(a, mid+1, j);
        merge(a, i, j);
        return;
    }
    
    int main()
    {
        //int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        int a[] = {9, 7, 2, 3, 5, 4, 1, 8, 6, 10};
        int i;
    
        mergesort(a, 0, 9);
    
        for (i = 0; i < 10; i++)
            printf ("%d ", a[i]);
    
        printf ("\n");
    
        return 0;
    }