C++选择排序算法中的逻辑错误

Logical error in a C++ selection sort algorithm?

本文关键字:错误 选择 排序 算法 C++      更新时间:2023-10-16

我是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的容器,但向量更灵活、更有用,尽管它会消耗一些额外的内存。

我希望我的回答足够清楚。如果你需要任何额外的帮助,我会在这里。祝你好运