在一本书上看到的选择排序算法,与网上找的之间比较。目的不是比哪个算法更好,只为多记一些方式,在有时候能用到。
#include<iostream>
using namespace std;
#define maxn 10007
int main(){
int a[maxn];
int t;//数组大小
while(cin >> t){
int itemp,ipos;
int i,j;
for(int i =0;i < t;i++){
cin >> a[i];
}
for( i = 0;i < t-1;i++){
itemp = a[i];ipos = i;
for( j = i+1;j <t;j++){
if(a[j]< a[i]){
itemp = a[j];ipos = j;
}
}
a[ipos] = a[i]; a[i] = itemp;
}
for(int i = 0;i < t;i++){
cout << a[i]<< " ";
}
}
return 0;
}
运行结果:
网上的代码:
#include<iostream>
using namespace std;
#define maxn 10007
int main(){
int a[maxn];
int t;//数组大小
while(cin >> t){
int itemp,ipos;
int i,j;
for(int i =0;i < t;i++){
cin >> a[i];
}
for( i = 0;i < t-1;i++){
ipos = i;//记录最小元素下标
for( j = i+1;j <t;j++){
if(a[j]< a[ipos]){
ipos = j;
}
}
if(i!=ipos){//交换
int temp = a[ipos];
a[ipos] = a[i];
a[i] = temp;
}
}
for(int i = 0;i < t;i++){
cout << a[i]<< " ";
}
}
return 0;
}
结果一样,都是上面那结果。
在写排序代码的时候,一定要注意:
1,第一层for循环从0到n-1,第二层是从i+1到n(按上面写的,t就是n)。
2,在第一层与第二层循环中间,一定要有一个记录最小(大)值的变量。
3,在交换两元素值时,不论那种方式,均得对应,不然会出错,达不到想要得结果。
4,学完一种之后,一定要理解这种,不能似懂非懂,不然解题会很烦人的。还有,尽量对比着记忆,这样会很快理解为什么这样写。
本人建议:在前几次写的时候,能自己写的自己写,写不了的可以参考别人写的,然后自己单步运行,逐一发现其中的变化过程。