开发者

Can someone tell me what's wrong with my mergesort?

Can someone tell me what's wrong with my mergesort implementation below? I've been scratching my head for hours..

void merge(int arr[], int low, int mid, int high)
{
    int i = 0;
    int j = 0;
    int k = 0;

    int buf1[1024];
    int buf1Length = mid - 开发者_如何学Golow + 1;

    int buf2[1024];
    int buf2Length = high - (mid + 1) + 1;

    for (i = low; i <= mid; i++)
    {
        buf1[j++] = arr[i];
    }

    for (i = mid + 1; i <= high; i++)
    {
        buf2[k++] = arr[i];
    }

    i = 0;
    j = 0;
    k = 0;

    while (j < buf1Length && k < buf2Length)
    {
        if (buf1[j] <= buf2[k])
        {
            arr[i++] = buf1[j++];
        }
        else
        {
            arr[i++] = buf2[k++];
        }
    }

    while (j < buf1Length)
        arr[i++] = buf1[j++];

    while (k < buf2Length)
        arr[i++] = buf2[k++];
}

void mergeSort(int arr[], int low, int high)
{
    int mid;

    if (low < high)
    {
        mid = (low + high) / 2;
        mergeSort(arr, low, mid);
        mergeSort(arr, mid + 1, high);
        merge(arr, low, mid, high);
    }
}

int main()
{
    int i;
    int arr[] = {6, 7, 2, 4, 9, 8};
    mergeSort(arr, 0, 5);

    printf("\n\n results: \n");
    for (i = 0; i < 6; i++)
    {
       printf("%d ", arr[i]);
    }
    printf("\n\n\n");

    return 0;
}


Are you sure you want to be doing this:

i = 0;
j = 0;
k = 0;

?

At first glance, I think it should be:

i = low;
j = 0;
k = 0;


Mergesort must merge sorted subsequences:

a = 1,3,5
b = 2,4,6
c = merge(a, b) // C = 1,2,3,4,5,6

You are not sorting any subsequence.


The problem is without a doubt in your merge() function.

I would imagine a merge function would go like this (any bugs in here are left to the reader :X ... this is untested and off the cuff, and should be used for conceptual purposes only! ):

/**
 * let mid be the last element of the first array
 * making mid + 1 the first element of the second
 */
merge(int[] arr, int low, int mid, int high) {

  int[] buff;
  int lowpos;
  int highpos;
  int i;

  buff = new int[high - low + 1];
  lowpos = low;
  highpos = mid + 1;

  // merge the two subarrays into the buffer
  for(i = 0; i < (high - low + 1); i++) {
    if(lowpos > mid)  buff[i] = arr[highpos++];

    else if(highpos > high) buff[i] = arr[lowpos++];

    else if(arr[lowpos] < arr[highpos] buff[i] = arr[lowpos++];

    else buff[i] = arr[highpos++];
  }

  // copy the buffer back into the main array
  for(i = 0; i < (high - low + 1) i++) arr[i+low] = buff[i];
} 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜