我是c++新手,目前正在尝试进行排序。但无论我如何尝试,似乎都不起作用。我对 while、for 循环和数组没有任何经验,所以我希望最终有一种方法可以在没有它们的情况下进行排序。
这是我的代码:
#include <iostream>
using namespace std;
int a;
int b;
int c;
int d;
void Sort(){
cout << "Enter 4 numbers.";
cin >> a;
cin >> b;
cin >> c;
cin >> d;
if (a < b){
swap (b,a);
}
if (b < c){
swap (c,b);
}
if (c < d){
swap (d,c);
}
}
int main () {
Sort();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在大家已经明白了学习数组管理和循环控制的要点,我来告诉你你的排序操作到底出了什么问题。它只是部分排序,因为您选择的比较和交换是不完整的,并且坦率地说是基于受过教育的天真的猜测。
可以使用静态排序网络对四个任意值进行降序排序(无需数组)。我不会讨论它们是如何工作的,以及如何生成它们的更复杂的任务(顺便说一句,生成器确实存在)。可以说,约翰关于排序比循环和数组复杂得多的评论是正确的,并且是无限的智慧,你应该首先学习后者。
不管怎样,请看下文
#include <iostream>
#include <cstdlib>
int main()
{
int a, b, c, d;
if (!(std::cin >> a >> b >> c >> d))
return EXIT_FAILURE;
if (a < b)
std::swap(a, b);
if (c < d)
std::swap(c, d);
if (a < c)
std::swap(a, c);
if (b < d)
std::swap(b, d);
if (b < c)
std::swap(b, c);
std::cout << a << ' ' << b << ' ' << c << ' ' << d << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这些比较和交换并不是任意的。之所以专门选择它们,是因为在算法的每个点上,每个变量中的内容都是其之前代码的直接反映。对于少数数字来说,这是视觉上可以理解的。一旦超过八个左右,事情就会变得非常复杂,而且很快。
您的代码已损坏,因为您实际上没有考虑交换比较中的每个步骤正在做什么,以及前面的步骤之后留下了什么。尽管您可以对较小的项目集执行此操作(优化的多阶段排序算法经常对较小的分区使用静态排序网络),但这并不是避免学习使用数组和循环控制等序列管理的借口。您将在余生中使用这些知识,并且不仅仅用于排序,还可以用于许多其他事情。