C++选择排序算法中的逻辑错误
Logical error in a C++ selection sort algorithm?
我是C++的新手,正在尝试编写这个简单的选择排序函数。如果答案对更有经验的程序员来说很简单,我很抱歉,但我是初学者,已经盯着这个看了很长时间,但没有用。这是我的代码:
#include <iostream>
#include <array>
using namespace std;
array<int, 10> unsorted {3, 4, 1, 5, 7, 2, 8, 9, 6, 0};
void printarray(array<int, 10> arr) {
int count = 0;
for (int i : arr) {
if (count < arr.size()-1) {
cout << i << ", ";
} else {
cout << i << endl;
}
count++;
};
}
int selection_sort(array<int, 10> arr) {
int test;
array<int, 10> newarr;
for(int j = 0; j < arr.size(); j++) {
test = arr[j];
for(int i = j; i < arr.size(); i++) {
if(arr[i+1] < test) {
test = arr[i];
}
}
newarr[j] = test;
}
printarray(newarr);
return 0;
}
int main() {
selection_sort(unsorted);
return 0;
}
当我运行这个函数时,它会打印一个包含10个零的int数组。我为数组赋值的方式(在C++中(是否有错误,或者逻辑本身是否有问题?
这两种实现都是错误的。我刚刚更正了@Adrisui3的回答。正确的解决方案:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> array(5);
int aux;
array[0] = 10;
array[1] = 2;
array[2] = 45;
array[3] = -5;
array[4] = 0;
for(int i = 0; i < array.size(); i++)
{
int min = i;
for(int j = i+1; j < array.size(); j++)
{
if(array[j] < array[min])
{
min = j;
}
}
if (i != min)
{
aux = array[i];
array[i] = array[min] ;
array[min] = aux;
}
}
for(int k = 0; k < array.size(); k++)
{
std::cout << array[k] << std::endl;
}
}
参考:wikipidia
这是实现Selection Sort的一种非常奇怪的方式。据我所见,您在那里犯了几个错误。首先,不能在第一个for循环中使用arr.size((,因为这会导致第二个循环超出限制,从而导致意外行为。如果碰巧这些是规则数组,你会得到一个很好的分割错误。即使您没有得到运行时错误,这也是您需要注意的。另一方面,这里的主要问题是由使用索引的方式以及实际上不需要第二个数组这一事实引起的。
这里有一个这个算法的例子。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> array(5);
int aux;
array[0]=10;
array[1]=2;
array[2]=45;
array[3]=-5;
array[4]=0;
for(int i=0; i<array.size()-1; i++)
{
for(int j=i+1; j<array.size(); j++)
{
if(array[j]<array[i])
{
aux=array[j];
array[j]=array[i];
array[i]=aux;
}
}
}
}
作为补充,我建议您使用向量而不是数组,两者都是STL的容器,但向量更灵活、更有用,尽管它会消耗一些额外的内存。
我希望我的回答足够清楚。如果你需要任何额外的帮助,我会在这里。祝你好运
相关文章:
- C++选择排序算法中的逻辑错误
- 防止在C++中选择错误文件时提升 xml 解析器崩溃
- 选择文件对话框错误
- C++为什么我的指针选择排序中存在分段错误?
- 从加密项目向量中解密任意选择的元素会导致无效的 PKCS #7 块错误
- 当我选择大于 720 的矩阵大小时,程序退出并显示错误代码.可能是什么原因?
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- 冲刺错误"variable may be unsafe" (C4996)...选择?
- 使用元编程选择 int 类型,将生成错误
- 如何修复列表视图中的错误?,封装控件时无法选择任何项
- 元数据操作失败LNK2022错误 (8013118D):重复类型中的布局信息不一致 (选择设备参数):(0x020002
- 为什么<iostream>运算符<<会选择明显错误的重载?
- 编译器选择错误的重载函数
- 如何允许用户在进行错误选择时再次输入
- 为什么日食总是发生错误"An internal error occurred during: "通知选择侦听器". java.lang.StackOverflowError"
- 为什么C 编译器选择错误的功能(模板)
- Meson选择了错误的编译器(GCC而不是在Clang上)
- lli:LLVM错误:无法选择:X86ISD::WrapperRIP TargetGlobalTLSA地址:i64
- 命名管道,选择错误的文件描述符C++
- 服务器端错误选择在s.cpp中重复