简单选择排序算法:
一趟选择排序:
通过n-i次关键字间的比较,从n-i+1个记录中选择出最小的记录,并和第i(1<= i <= n)个记录交换之。
代码:
#include<stdio.h>
#define MAXSIZE 20 //数组大小
typedef int KeyType; //关键字类型
typedef int InfoType; //元素信息类型
//数组中元素的信息
typedef struct{
KeyType key; //元素排序的关键字
InfoType otherinfo; //元素信息
}RedType;
//数组的类型
typedef struct{
RedType r[MAXSIZE+1];
int length;
}SqList;
//初始化待排序列
void Init(SqList *L,int a[],int length)
{
int i;
RedType rt;
for(i = 0;i < length;i++){
rt.key = a[i];
rt.otherinfo = i;
L->r[i] = rt;
}
L->length = length;
}
//交换数组中两元素的值
void swap(RedType *p,RedType *q){
RedType temp = *p;
*p = *q;
*q = temp;
}
//查询数组中key最小元素的下标
int SelectMinKey(SqList *L,int i){
int j,min = i;
for(j = i;j < L->length;j++){
if(L->r[j].key < L->r[min].key)
min = j;
}
return min;
}
//选择排序主程序
void SelectSort(SqList *L){
int i,j,k,l;
for(i = 0;i<L->length;++i){
j = SelectMinKey(L,i);
if(i != j){
printf("\n\n第%d趟 从小标为%d开始找最小值:min = %d 交换 %d <=> %d \n",i,i,L->r[j].key,L->r[i].key,L->r[j].key);
swap(&(L->r[i]),&(L->r[j]));
printf("交换后:");
for(k = 0;k < 9;k++){
printf("%-2d ",L->r[k].key);
}
printf("\n下标号:");
for(l = 0;l < 9;l++){
printf("%-2d ",L->r[l].otherinfo);
}
}
}
}
int main(){
SqList L;
int i;
int a[9] = {0,49,38,65,97,76,13,27,49};
Init(&L,a,9);
printf("排序前:");
for(i = 0;i < 9;i++){
printf("%-2d ",L.r[i].key);
}
printf("\n下标号:");
for(i = 0;i < 9;i++){
printf("%-2d ",L.r[i].otherinfo);
}
SelectSort(&L);
printf("\n\n排序后:");
for(i = 0;i < 9;i++){
printf("%-2d ",L.r[i].key);
}
printf("\n下标号:");
for(i = 0;i < 9;i++){
printf("%-2d ",L.r[i].otherinfo);
}
printf("\n\n");
return 0;
}
运行效果图:
第一趟中从0下标开始往后找最小元素,结果最小元素就是0下标出的元素,所以不做交换。