【问题标题】:Why doesn't my bubble sort work for double data type?为什么我的冒泡排序不适用于双精度数据类型?
【发布时间】:2018-02-02 13:27:17
【问题描述】:

我正在尝试编写一个使用冒泡排序对数组进行排序的函数。我为整数数组编写的版本似乎工作正常。但是双数组的版本什么都不做(它返回一个与输入数组完全相同的数组)。我对 c++ 和一般编码比较陌生。 这个很好用。

void swap(int *xp, double *yp)
{
    double temp = *xp;
    *xp = *yp;
    *yp = temp;
}
void bubblesort(int arr[],int size)
{
    bool fin;
    while(fin)
    {
        fin=false;
        for (int i=0;i<size-1;i++)
        {
            if (arr[i]>arr[i+1])
            {
                swap(&arr[i],&arr[i+1]);
                fin=true;
            }
        }
    }
}

但是这个功能好像不行

void swap(double *xp, double *yp)
{
    double temp = *xp;
    *xp = *yp;
    *yp = temp;
}
void bubblesort(double arr[],int size)
{
    bool fin;
    while(fin)
    {
        fin=false;
        for (int i=0;i<size-1;i++)
        {
            if (arr[i]>arr[i+1])
            {
                swap(&arr[i],&arr[i+1]);
                fin=true;
            }
        }
    }
}

【问题讨论】:

  • bool fin = true; 在进入 while 循环之前 ..
  • 你依赖 UB,fin 没有初始化。你的编译器应该已经发出警告(如果没有,提高警告级别)
  • @Borgleader 谢谢,这似乎成功了。但是为什么在整数版本中没有引起问题。另外,您如何提高警告级别(我将 Codeblocks 与 mingw 一起使用)
  • @RaheebHassan 为什么在整数版本中没有引起问题 -- 只有在向最大的潜在客户演示您的程序时才会引起麻烦,你的程序崩溃了。这就是未定义行为的本质——任何事情都可能随时发生......
  • 未定义的行为是未定义的。有时它确实有效,但你不能依赖它。

标签: c++ arrays double bubble-sort


【解决方案1】:

正如其中一个 cmets 所指定的,您尚未初始化 bool fin,这将导致 UB

简单来说,变量 fin 未初始化,读取未初始化的变量会导致未定义的行为。

所以不要这样做。当你这样做的那一刻,你的程序就不再保证做你所说的任何事情,这可能是它在一种情况下工作而不在另一种情况下工作的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2015-06-29
    • 2012-06-26
    相关资源
    最近更新 更多