讨论了使用cpp实现选择排序
Coufused about using cpp to achieve selection sort
我尝试在C++中实现选择排序,当我封装交换函数时,输出显示了很多零。但在数组开始时,代码仍然有效。当我用注释中的代码替换交换函数时,输出是正确的。我被这个结果弄糊涂了,谁能帮我解决呢?
#include <iostream>
#include <string>
using namespace std;
template<class T>
int length(T& arr)
{
return sizeof(arr) / sizeof(arr[0]);
}
void swap(int& a, int& b)
{
a += b;
b = a - b;
a = a - b;
}
int main()
{
int array[] = { 2,2,2,2,6,56,9,4,6,7,3,2,1,55,1 };
int N = length(array);
for (int i = 0; i < N; i++)
{
int min = i; // index of min
for (int j = i + 1;j < N; j++)
{
if (array[j] < array[min]) min = j;
}
swap(array[i],array[min]);
// int temp = array[i];
// array[i] = array[min];
// array[min] = temp;
}
for (int i = 0; i < N; i++)
{
int showNum = array[i];
cout << showNum << " ";
}
return 0;
}
问题是,如果a
和b
引用相同的变量,则交换函数不起作用。例如,当调用swap(array[i], array[i])
时。
注意,在这种情况下,此行:b = a - b;
将把b
设置为零,因为a
和b
是相同的变量。
当i
阵列元素偶然已经就位时,就会发生这种情况。
offtopic:
学习将代码拆分为函数。避免在单个函数中放入大量代码,尤其是main
。请参见示例。这比你想的更重要。
您的交换函数没有执行它应该执行的操作。只需使用它或修复当前的交换即可。
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
相关文章:
- 在运行时选择父类的实现
- 如何在类中实现可选择的类似命名空间的功能?
- 如何实现链表并允许用户选择要使用 C++ 删除的特定节点?
- 在运行时选择要使用的 CRTP 实现
- 有没有办法根据模板参数的类型在不同的类实现之间进行选择
- 在使用Bazel Build构建项目期间,处理/选择界面的不同实现
- C++选择排序的实现不正确.任何建议
- 在C 复杂性和实现中选择位向量
- Cocoa 选择器的行为可以在 C++ 中重新实现吗?
- 为什么选择我的自定义OP的CPU实现
- 我是否应该使用功能指针在构造函数中选择实现
- 如何利用遗传算法求C中数的平方根来实现选择和交叉
- 我如何实现 N 选择 K,允许元素重复,并对具有重复元素的输出进行低优先级
- 使用列表C++实现选择排序
- 在C++中实现选择排序时出错
- C++11:根据项目计数在 std::array 和 std::unordered_map 之间实现选择器
- 使用函数实现选择排序
- 如果我不想在 QAbstractItemView 中实现选择,我应该返回哪些值?
- 在基于数组的列表上实现选择排序
- 使用数组列表实现选择排序