我的升序排序问题是一个好的解决方案吗


#include <iostream>
using namespace std;
int main() {
// Problem #2 Ascending Order
int num1, num2, num3, small, medium, large;
cin >> num1 >> num2 >> num3;
if(num1 <= num2 && num1 <= num3) {
small = num1;
if(num2 <= num3) {
medium = num2;
large = num3;
} else {
large = num2;
medium = num3;
}
} else if(num2 <= num1 && num2 <= num3) {
small = num2;
if(num3 <= num1) {
medium = num3;
large = num1;
} else {
large = num3;
medium = num1;
}
} else {
small = num3;
if(num2 <= num1) {
medium = num2;
large = num1;
} else {
large = num2;
medium = num1;
}
}
cout << small << " " << medium << " " << large;
return 0;

/*这段代码是按照升序对3个数字进行排序,这就是我想出的解决方案。我不确定这是否是一个好答案,他们有更好的方法吗?我应该对此感到高兴吗解决方案有什么想法吗?我是编程新手,想知道我提出的解决方案是否现实主义的?比如,如果我这样解决问题,他们是否足以让我找到工作?这个节目吗我是个糟糕的程序员?*/

否。你的代码太复杂了。说真的,我花了一些精力来阅读它并理解每一个细节。它是非常重复的,有很多潜在的简单错误破坏正确性。对三个数字进行排序的代价太高了。

不要重新发明轮子,了解你的<algorithm>s。

您需要最小的数字(std::min(、最大的(std::max(和另一个数字:

#include <algorithm>
#include <iostream>
int main(){
int a = 42;
int b = 2;
int c = -13;
int smallest = std::min({a,b,c});
int biggest = std::max({a,b,c});
// int middle = a+b+c-smallest-biggest;      // might overflow
int middle = a ^ b ^ c ^ smallest ^ biggest; // no overflow
std::cout << smallest << " " << middle << " " << biggest << "n";
}

实时演示

PatrickRoberts指出了溢出并提供了非溢出解决方案。

即使,例如,作为练习,你会避免使用标准算法,你仍然应该使用函数。它们不需要复杂。int max(int a,int b)已经有助于大大简化您的代码。

为什么有这么多变量?

int small, medium, large;
std::cin >> small >> medium >> large;
// Force "small" to be the smallest.
if (small > medium) std::swap(small, medium);
if (small > large)  std::swap(small, large);
// Now to deal with "medium" and "large"
if (medium > large) std::swap(medium, large);

我错过什么了吗?

您的代码不好,因为

使用
  • using namespace std;
  • 您为排序写了太多的行,这是一种非常常用的算法,并且有一个标准库可以做到这一点

编写大量代码会产生大量漏洞。

我更喜欢使用std::sort在C++中进行排序。

#include <iostream>
#include <algorithm>
int main(void) {
constexpr int N = 3;
int num[N];
for (int i = 0; i < N; i++) {
if (!(std::cin >> num[i])) {
std::cerr << "read error" << std::endl;
return 1;
}
}
std::sort(num, num + N);
for (int i = 0; i < N; i++) {
if (i > 0) std::cout << ' ';
std::cout << num[i];
}
return 0;
}

如果不允许使用数组并更改变量num1num2num3的输入值,那么我可以建议以下解决方案,其中只有三个If语句

#include <iostream>
#include <functional>
int main() 
{
int num1, num2, num3;
auto small = std::cref( num1 ), medium = std::cref( num2 ), large = std::cref( num3 );
std::cin >> num1 >> num2 >> num3;

if ( medium.get() < small ) std::swap( medium, small );
if ( large.get() < medium ) std::swap( large, medium );
if ( medium.get() < small ) std::swap( medium, small );

std::cout << "small = " << small
<< ", medium = " << medium
<< ", large = " << large
<< 'n';

return 0;
}

例如,如果要输入以下值

5 3 4

那么输出将是

small = 3, medium = 4, large = 5

在某些方面与您的方法类似的另一种方法是以下

#include <iostream>
#include <functional>
#include <algorithm>
int main() 
{
int num1, num2, num3;
int small, medium, large;
std::cin >> num1 >> num2 >> num3;

if ( not ( num2 < num1 ) and not ( num3 < num1 ) ) 
{
small = num1;
std::tie( medium, large ) = std::minmax( num2, num3 );
}       
else if ( not ( num3 < num2 ) ) 
{
small = num2;
std::tie( medium, large ) = std::minmax( num1, num3 );
} 
else 
{
small = num3;
std::tie( medium, large ) = std::minmax( num1, num2 );
}
std::cout << "small = " << small
<< ", medium = " << medium
<< ", large = " << large
<< 'n';

return 0;
}

如果再次输入与上所示相同的值序列

5 3 4 

那么输出将是

small = 3, medium = 4, large = 5

与原始解决方案一样,可以减少if语句条件下的子表达式数量。例如

#include <iostream>
int main() 
{
int num1, num2, num3;
int small, medium, large;
std::cin >> num1 >> num2 >> num3;

if ( not ( num2 < num1 ) and not ( num3 < num1 ) ) 
{
small = num1;
if ( not ( num3 < num2 ) )
{
medium = num2;
large = num3;
}
else
{
medium = num3;
large = num2;

}
}       
else if ( not ( num3 < num2 ) ) 
{
small = num2;
if ( not ( num3 < num1 ) )
{
medium = num1;
large = num3;
}
else
{
medium = num3;
large = num1;

}
} 
else 
{
small = num3;
if ( not ( num2 < num1 ) )
{
medium = num1;
large = num2;
}
else
{
medium = num2;
large = num1;

}
}
std::cout << "small = " << small
<< ", medium = " << medium
<< ", large = " << large
<< 'n';

return 0;
}

对于三个数字的排序问题,这是一个不错的解决方案。它相当容易遵循,表现也相当好。并且验证其正确性是相当容易的。

但是,在现实世界或学术界,如果你被要求做的下一件事不是对四个数字进行排序或对n数字进行排序,你应该感到非常惊讶。您的方法不适用于n的任何其他值,并且不能真正扩展。

相关内容

最新更新