c++ - 归并排序中选择中间元素

标签 c++ sorting

对于下面给定的合并排序代码:

void merge(int a[], int bottom, int top, int mid){
    int i = bottom;
    int j = mid+1;
    int k = bottom;
    int c[50];

    while (i <= mid&&j <= top){
         if(a[i]<=a[j]){
         c[k] = a[i];
         i++;
         k++;
         }
     else{
         c[k] = a[j];
         j++;
         k++;
         }
    }

    while (i <= mid){
     c[k] = a[i];
     k++;
     i++;
    }

    while (j <= top){
     c[k] = a[j];
     k++;
     j++;
    }

    for (int i = bottom; i < k; i++){
     a[i] = c[i];   
    }
}

void mergesort(int a[], int bottom, int top){
    if(bottom < top){
     int mid = (bottom+top)/2;
     mergesort(a, bottom, mid);
     mergesort(a, mid+1, top);
     merge(a, bottom, top, mid);
    }
}

如果将合并排序调用更改为

mergesort(a, bottom, mid-1);
mergesort(a, mid, top);

这会导致运行时错误。

从算法方面来看,我没有看到任何差异。有人可以指出这一更改有什么问题吗?

最佳答案

假设底部为 0,顶部为 1,因为您调用了 mergesort(a, 0, 1) 。那么 mid = (0+1)/2 = 0。然后 mid-1 = -1。那么您调用mergesort(a, 0, -1)mergesort(a, 0, 1) (注意...这是我们开始的调用)。第一个调用将返回,因为它与 bottom < top 不匹配条件,但第二个是无限递归。

如果您注意到,此问题适用于 mergesort(a, n, n + 1) 形式的所有调用,并且由于合并排序是一种分而治之类型的算法,因此您将非常频繁地进行此类调用。

关于c++ - 归并排序中选择中间元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28750882/

相关文章:

c++ - 用我自己的实现替换 getpid

c++ - 左值在使用 std::map 时指定 const 对象

c++ -/usr/bin/ld 仅在编译期间找不到 <library>

javascript - 为什么这种插入排序无法对对象数组进行排序? (但可以其他值)

java - 创建可以对字符串/整数数组进行排序的算法

java - 如果 TreeSet 从最旧到最新排列数据,则哪个类将它们从最新到最旧排序

c++ - 编译时 std::ratio 的 std::ratio 功率?

sorting - VBScript WQL 排序结果集?

javascript - 如何对数组进行排序,将最常见的元素排在第一位?

c++ - 使用 Builder 6 应用程序形式的井字游戏