c++ - 如何修复输出显示,使其显示正确排序的数据
问题描述
当我调用我的打印函数时,我的程序会在我通过冒泡排序后显示未排序的数据。我已经将我的代码与朋友和我在 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
解决方案
欢迎来到堆栈溢出!看来您在这里所拥有的是按值传递与按引用传递的经典案例。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))
这里有一组很好的有关按值传递和按引用传递的相关信息。有一点技术性,因为您实际上是将指针的值传递到上述示例中,这在技术上使其按值传递,但它是对您要修改的实际变量的引用,所以这个概念仍然在这里成立。
推荐阅读
- c# - 如何在其引用的单元格内容更改时更新单元格的内容
- azure-devops - Azure Pipelines Stages (YAML) 上的手动触发器
- python - AttributeError: 'NoneType' 对象在启动 Anaconda Powershell 提示时没有属性 'loader'
- c# - C# Thread.Sleep(ms) 冻结 UI,我无法使用替代选项
- bash - 运行脚本后保持 ssh 隧道打开
- matlab - 在 Matlab 中,为什么输入解析器会使位置参数无效,即使没有设置验证函数?
- azure-devops - 使用自定义脚本扩展和 Azure DevOps 将 Web 应用程序部署到 azure scaleset
- opencv - 在 Ubuntu 16.04 中使用 CUDA 9.0 编译 openCV 4.1.2 时出错
- c# - 将上传控制器从支持 .xlsx 更改为 .csv
- c - 怎么能
类型保证位宽?