讨论了使用cpp实现选择排序

Coufused about using cpp to achieve selection sort

本文关键字:实现 选择 排序 cpp      更新时间:2024-09-22

我尝试在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;
}

问题是,如果ab引用相同的变量,则交换函数不起作用。例如,当调用swap(array[i], array[i])时。

注意,在这种情况下,此行:b = a - b;将把b设置为零,因为ab是相同的变量。

i阵列元素偶然已经就位时,就会发生这种情况。

offtopic:
学习将代码拆分为函数。避免在单个函数中放入大量代码,尤其是main。请参见示例。这比你想的更重要。

您的交换函数没有执行它应该执行的操作。只需使用它或修复当前的交换即可。

void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}