有人能告诉我我的合并排序有什么问题吗?

发布于 2024-10-17 15:06:26 字数 1304 浏览 6 评论 0原文

有人可以告诉我下面的合并排序实现有什么问题吗?我已经挠头好几个小时了..

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 - low + 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;
}

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 - low + 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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

待天淡蓝洁白时 2024-10-24 15:06:26

您确定要这样做吗:

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

乍一看,我觉得应该是:

i = low;
j = 0;
k = 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;
浮萍、无处依 2024-10-24 15:06:26

合并排序必须合并已排序的子序列:

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

您不对任何子序列进行排序。

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.

得不到的就毁灭 2024-10-24 15:06:26

毫无疑问,问题出在您的 merge() 函数中。

我想合并函数会像这样(这里的任何错误都留给读者:X ...这是未经测试的,即兴的,应该仅用于概念目的!):

/**
 * 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];
} 

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];
} 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文