简单选择排序

简单选择排序算法:

一趟选择排序:

通过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下标出的元素,所以不做交换。

运行效果图

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值