选择排序包括简单选择排序、树形选择排序、堆排序。
选择排序中最简单的是简单选择排序。
本文针对简单选择排序。
原理是每次循环选择出后边序列中最小的数据并和前边的数据交换位置,直到循环到最后一个元素。
程序:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
#define N 15
typedef struct{
int key;
int other;
}node;
typedef struct
{
node array[MAXSIZE + 1];
int length;
}list;
//查询并返回后边的序列中最小数据的下标
int select_min(list *l,int i)
{
int min;
int j,position;
position = i;
min = l->array[i].key;
for(j = i + 1;j <= l->length;j++)
if(l->array[j].key < min){ //比较,得出最小的数据的下标
position = j;
min = l->array[j].key;
}
return position;
}
//简单选择排序
void simple_select_sort(list *l)
{
int i,j;
node temp;
for(i = 1;i < l->length;++i){
j = select_min(l,i);
if(i != j){
temp = l->array[i];
l->array[i] = l->array[j];
l->array[j] = temp;
}
}
}
//打印序列
void print(list *l)
{
int i;
for(i = 1;i <= l->length;i++)
printf("%d %d\t",l->array[i].key,l->array[i].other);
printf("\n");
}
void main()
{
node data[N]={{5,6},{13,5},{22,2},{2,4},{6,5},{99,7},{6,15},{1,22},{15,12},{58,12},{48,40},{26,48},{38,35},{72,58},{61,22}};
list l;
int i;
for(i = 0;i < N;i++)
l.array[i + 1] = data[i];
l.length = N;
printf("befor sort:\n");
print(&l);
simple_select_sort(&l);
printf("after simple select sort:\n");
print(&l);
}
结果:
[16:00:56]# ./c
befor sort:
5 6 13 5 22 2 2 4 6 5 99 7 6 15 1 22 15 12 58 12 48 40 26 48 38 35 72 58 61 22
after simple select sort:
1 22 2 4 5 6 6 5 6 15 13 5 15 12 22 2 26 48 38 35 48 40 58 12 61 22 72 58 99 7