【问题标题】:How to fix output display so it shows correctly sorted data如何修复输出显示,使其显示正确排序的数据
【发布时间】:2019-04-30 15:20:48
【问题描述】:

当我调用我的打印函数时,我的程序会在我通过冒泡排序后显示未排序的数据。我已将我的代码与朋友和我在 geeksforgeeks (https://www.geeksforgeeks.org/bubble-sort/) 上找到的关于冒泡排序的文章进行了比较,无论出于何种原因,我的数据都不会排序。

我正在为我的大学数据结构课程编写一个具有 4 个排序功能的程序。理论上应该发生的是程序读取包含 8000 个随机数的数据文件,并根据调用的排序(冒泡排序、插入排序、选择排序和快速排序)对数据进行排序。调用打印函数并将显示每 1000 个数据元素以显示数据确实已排序。我尝试在 main 中编写我的打印代码,将打印调用放入排序函数中,并使用函数进行打印,Quadruple 检查了我的排序函数。我也尝试过不同的编译器和不同的计算机,但我怀疑我的代码有些古怪。

原码:

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
const int arraysize = 8000;
int numcompares, numcopies;
void swapem(double a, double b)
{
    double temp;
    temp = a;
    a = b;
    b = temp;
}
void bubblesort(double r[], int n)
{
    int j, i;
    for (j = 0; j < n - 1; j++)
    {
        for (i = 0; i < n - 1; i++)
        {
            numcompares++;
            if (r[i] > r[i + 1])
            {
                swapem(r[i], r[i + 1]);
                numcopies += 3;
            }
        }
    }
}
void printem(double r[])
{
    cout <<  r[1000] << ", " << r[2000] << ", " << r[3000] << ", " <<
    r[4000] << ", " << r[5000] << ", " << r[6000] << ", " << r[7000] << ", " << r[7999] << endl;
}
int main()
{
    ifstream inf("data.dat");
    ofstream outf("sorted.ot");
    string sortname;
    double arraynums[arraysize];
    for (int i = 0; i < arraysize; i++)
    {
        inf >> arraynums[i];
    }
    bubblesort(arraynums, arraysize);
        system("pause");
    return 0;
}

我试过了:

void printem(double r[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        cout << r[i]<< ", ";    
}
printem(arraynums,20); // in main

和主要

for (int i = 0; i < 10; i++)
    {
        cout << arraynums[i] << endl;
    } 


这是拒绝排序的 8000 个随机整数中的 10 个

41275.4
12113.1
50676
7662.34
50688.3
-7926.28
13672.8
-3212.9
-13046.5
-16798

输出应该是: -16798 -13046.5 -7926.28 -3212.9 7662.34 12113.1 13672.8 41275.4 50676 50688.3

但它仍保持未排序的形式: 41275.4 12113.1 50676 7662.34 50688.3 -7926.28 13672.8 -3212.9 -13046.5 -16798

【问题讨论】:

  • 您可能想单独测试swapem 函数。
  • 欢迎来到 Stack Overflow。你熟悉引用传递和值传递的区别吗?

标签: c++ algorithm sorting


【解决方案1】:

欢迎来到堆栈溢出!看起来你这里是按值传递 vs 按引用传递的经典案例。 C 中的函数不能在其自身范围之外修改其参数的值,它可以访问其参数引用的内存并对其进行修改。

swapem() 只对方法本身范围内的 a 和 b 进行更改,但不会更新 a 和 b 位置引用的数据。为了解决这个问题,您可以将 a 和 b 作为指针传入,并修改指针引用的值,如下所示:

void swapem(double *a, double *b) {
     double temp = *a;
     *a = *b;
     *b = temp;
}

并且该方法本身将采用这些数组元素的引用而不是它们的值。对于上面的例子,它看起来像这样:

swapem(r + i, r + (i + 1))

有一组很好的相关信息here关于按值传递和按引用传递。有一点技术性,因为您实际上是将指针的值传递到上述示例中,这在技术上使其按值传递,但它是对您要修改的实际变量的引用,所以这个概念仍然在这里成立。

【讨论】:

  • 第一次尝试!非常感谢!!
【解决方案2】:

了解您的bubblesort() 函数的作用很重要。它接收数组成员“arraynums”的COPY。它对其进行排序,然后终止。在这个函数结束时,你没有这个排序数组。

但是等等,即使您的 swapem() 也不起作用,因为它还将接收 2 个值的副本并在本地进行交换。在此调用之后,您将不会获得交换的值。

要解决这个问题,您需要在 swapem() 函数中使用传递引用。

void swapem(double & a, double & b)
{
    double temp;
    temp = a;
    a = b;
    b = temp;
}

在 bubbelsort() 函数中,如果您希望使用bubbelsort 进行打印,可以直接使用 printem() 函数。相反,您可以简单地将数组作为对 bubblesort() 的引用传递,最后您将拥有修改后的 arraynums 数组。

【讨论】:

  • bubblesort 调用接收数组地址,那里没有发生复制。关于swapem的第二点是有效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多