1.选择排序原理
选择排序第i趟排序从第i个记录开始扫描序列,在n-i+1(1≤i≤n-1)个记录中找到关键码最小的记录,并和第i个记录交换作为有序序列的第i个记录。
2.伪代码
算法3.6——选择排序
void SelectSort(int r[ ], int n) //数组下标从1开始
{
for (i=1; i<=n-1; i++) //对n个记录进行n-1趟简单选择排序
{
index=i;
for (j=i+1; j<=n; j++) //在无序区中找最小记录
if (r[j]<r[index]) index=j;
if (index!=i) r[i]←→r[index]; //若最小记录不在最终位置则交换
}
}
3.举例
按照从大到小的顺序排列这五个数字:4 9 2 6 8
index是这一趟比较过程中最小的数的位置下标,每趟首次比较将开始比较的第一个数设置成最小数
每次比较r[index]和r[j],就是按顺序和最小数相比,如果有比当前最小的数还小的数,就改变index的值为这个数的位置下标
在找完这一趟的最小数的位置下标后,把这一趟的最小数放在这一趟开始比较的第一个的位置上,比如在第一趟(i=0,从位置下标为0处开始比较)比较中发现了2是最小的数,就把2放在位置下表是0的位置上。
- 第一趟 i=0时 初始数组{4 9 2 8 6}
- j=1 index=i=0, {4 9 2 8 6} 4<9, index不变
- j=2 index=0, {4 9 2 8 6} 4>2, index->2
- j=3 index=2, {4 9 2 8 6} 2<8, index不变
- j=4 index=2, {4 9 2 8 6} 2<6, index不变
第一趟中,一共比较了4次,找到了最小的数是 (r[index]=)2,位置下标是[index=]2 ;把最小的数放在最前面,也就是交换r[i]和r[index]的位置,当前数组为{2 9 4 8 6}
- 第二趟 i=1时 初始数组{2 9 4 8 6}
- j=2 index=i=1, {2 9 4 8 6} 9>4, index->2
- j=3 index=2, {2 9 4 8 6} 4<8, index不变
- j=4 index=2, {2 9 4 8 6} 4<6, index不变
第二趟中,一共比较了3次,找到了最小的数是 (r[index]=)4,位置下标是[index=]2 ;把最小的数放在最前面,也就是交换r[i]和r[index]的位置,当前数组为{2 4 9 8 6}
- 第三趟 i=2时 初始数组{2 4 9 8 6}
- j=3 index=i=2, {2 4 9 8 6} 9>8, index->3
- j=4 index=3, {2 4 9 8 6} 8>6, index->4
第三趟中,一共比较了2次,找到了最小的数是 (r[index]=)6,位置下标是[index=]4 ;把最小的数放在最前面,也就是交换r[i]和r[index]的位置,当前数组为{2 4 6 8 9}
- 第四趟 i=3时 初始数组{2 4 6 8 9}
- j=4 index=i=3, {2 4 6 8 9} 8<9, index不变
第四趟中,一共比较了1次,找到了最小的数是 (r[index]=)8,位置下标是[index=]3 ;把最小的数放在最前面,也就是交换r[i]和r[index]的位置,当前数组为{2 4 6 8 9}
4.完整代码(C++)
#include<iostream>
#include<cmath>
using namespace std;
#define N 500
void SelectSort(int r[],int n){
//int temp=0;
int i=0,j=0;
int index=0;
//排序n个数,子需要排序n-1趟就是有序数列了
for(i=0;i<n-1;i++){//每次循环后将第i小的元素放好
index=i;//记录从第i个到第n-1个元素中,最小的那个元素的下标
for(j=i+1;j<n;j++){
if(r[index]>r[j]) index=j;
}
//将找到的第i个小元素放在第i个位置上
//temp=r[i];
//r[i]=r[index];
//r[index]=temp;
swap(r[i],r[index]);//用于交换传入两个数值的函数
}
}
int main(){
cout<<"请输入数组中的元素个数n:"<<endl;
int n;
cin>>n;
int r[N];
cout<<"请输入需要选择排序的数组元素:"<<endl;
for(int i=0;i<n;i++)
cin>>r[i];
SelectSort(r,n);
for(int i=0;i<n;i++){
cout<<r[i]<<" ";
}
return 0;
}