选择排序即:每轮从第i个数开始包括第i个数在内,找到其中最小的数,与第i个数交换位置。
注意:
- 当比较到最后一个数时,可以不比较
- 当最小的数就是最初开始赋值给min的数时,可以不进行交换,因为有的交换方式在两个名称或指针指向同一个值的时候,不能实现正确的交换
- 所以在交换前可以加一个判断
具体代码实现见如下:
#include
using namespace std;
int main(){
int data[5] = {3,4,2,5,3};
//选择排序
for(int i = 0;i < 5 - 1;i++){//注意这里的5 - 1,只剩下最后一个数时,不需要再进行比较交换
/*
当这里的 5 - 1 换成 5时 数据交换方式1 2 4都会出现问题
*/
int minpos = i;
for(int j = i + 1;j < 5;j++){
if(data[minpos] > data[j]){
minpos = j;
}
}
//数据交换方式 1
// int &a = data[minpos];//这里用异或代替不行,当两个数相等的时候同时指向一个数据,异或为零
// int &b = data[i];
// a = a^b;
// b = a^b;
// a = a^b;
//数据交换方式 2
//采用这种交换方式时data[minpos] 可以等于 data[i] 但是 minpos 不能等于 i
//它们不能指向同一个地址
// data[minpos] = data[minpos]^data[i];
// data[i] = data[minpos]^data[i];
// data[minpos] = data[minpos]^data[i];
//数据交换方式 2 的另一种写法
// if(minpos != i)
// data[minpos] ^= data[i] ^= data[minpos] ^= data[i];
//数据交换方式 3 这是最稳妥的一种方法 推荐使用
int temp = data[minpos];
data[minpos] = data[i];
data[i] = temp;
//数据交换方式 4
//采用这种交换方式时data[minpos] 可以等于 data[i] 但是 minpos 不能等于 i
// data[minpos] = data[minpos] + data[i];
// data[i] = data[minpos] - data[i];
// data[minpos] = data[minpos] - data[i];
}
for(int i = 0;i < 5;i++){
cout << data[i] << " ";
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)