正常选择排序
- 从待排序的数组中,找到下标最小的元素 k=i
- 从i+1开始找,找到比它大的数 k=j
- 交换下标为i和下标为k的数
#include<bits/stdc++.h>
using namespace std;
const int n=10;
int main(){
//初始化数组
int a[n]={1,3,45,90,8,5,5,6,2,33};
//输出原数组
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
//进行选择排序
for(int i=0;i<n;i++){
int k=i;
for(int j=i+1;j<n;j++){
if(a[k]>a[j]) k=j;
}
if(k!=i){
/*int temp=a[k];
a[k]=a[i];
a[i]=temp;*/
swap(a[k],a[i]);
}
}
//输出排序后数组
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}
优化后的选择排序
优化思路为每次找到最大值和最小值,使循环减少一般
#include<bits/stdc++.h>
using namespace std;
const int n=10;
int main(){
//初始化数组
int a[n]={1,3,45,90,8,5,5,6,2,33};
//输出原数组
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
//进行选择排序
for(int i=0;i<n/2;i++){
int maxlength=n-i-1;
int min=i;
int max=n-i-1;
for(int j=i+1;j<n-i;j++){
if(a[min]>a[j]) min=j;
if(a[max]<a[j]) max=j;
}
if(min!=i){
/*int temp=a[k];
a[k]=a[i];
a[i]=temp;*/
swap(a[min],a[i]);
}
if(max!=maxlength){
swap(a[max],a[maxlength]);
}
}
//输出排序后数组
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}