基本思想:

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

简单选择排序的示例:

排序算法(三):简单选择排序(Simple Selection Sort)_ios

操作方法:

第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;

第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;

以此类推.....

第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,

直到整个序列按关键码有序。

算法实现:

#include <stdio.h>
#include <iostream>
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

 

 

算法优化(一):最大值和最小值同时查找

#include <stdio.h>
#include <iostream>
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