基本思想:
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
简单选择排序的示例:
操作方法:
第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;
第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;
以此类推.....
第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,
直到整个序列按关键码有序。
算法实现:
using namespace std;
void print(int a[],int i)
{
cout<<i <<" : ";
for(int j= 0; j<8; j++)
{
cout<<a[j] <<" ";
}
cout<<endl;
}
void selection_sort (int a[], int n)
{
int i,j,pos,tmp;
for (i=0; i<n-1; i++)
{
//寻找最小值的下标
for (pos=i, j=i+1; j<n; j++)
if (a[pos]>a[j])
pos=j;
if (pos != i) {
tmp=a[i];
a[i]=a[pos];
a[pos]=tmp;
}
print(a, i);
}
}
int main(){
int a[8] = {3,1,5,7,2,4,8,6};
selection_sort(a,8);
return 0;
}
运行结果:
0 : 1 3 5 7 2 4 8 6
1 : 1 2 5 7 3 4 8 6
2 : 1 2 3 7 5 4 8 6
3 : 1 2 3 4 5 7 8 6
4 : 1 2 3 4 5 7 8 6
5 : 1 2 3 4 5 6 8 7
6 : 1 2 3 4 5 6 7 8
算法优化(一):最大值和最小值同时查找
using namespace std;
void print(int a[],int i)
{
cout<<i <<" : ";
for(int j= 0; j<8; j++)
{
cout<<a[j] <<" ";
}
cout<<endl;
}
void selection_sort (int a[], int n)
{
int i,j,max, min,tmp;
for (i=0; i<n/2; i++)
{
//寻找最小值的下标
min = i;
max = n - i - 1;
for (j = i+1; j < n - i; j++)
{
if (a[max] < a[j]){
max = j;
continue;
}
if (a[min] > a[j])
min = j;
}
if (max != n - i - 1) {
tmp = a[n - i - 1];
a[n - i - 1] = a[max];
a[max] = tmp;
}
if (min != i) {
tmp = a[i];
a[i] = a[min];
a[min] = tmp;
}
printf("max = %d, min = %d\n", max, min);
print(a, i);
}
}
int main(){
int a[8] = {3,1,5,7,2,4,8,6};
selection_sort(a,8);
return 0;
}
运行结果:
max = 6, min = 1
0 : 1 3 5 7 2 4 6 8
max = 3, min = 4
1 : 1 2 5 6 3 4 7 8
max = 3, min = 4
2 : 1 2 3 4 5 6 7 8
max = 4, min = 3
3 : 1 2 3 4 5 6 7 8