排序算法之选择排序

         首先我们先要了解选择排序的思路哦 

        比如我这里有一个数组a[10]={1,8,6,7,2,9,4,3,0,5},元素是无序的,我想用选择排序实现从小到大升序排序,我应该怎么做呢?

        首先我需要用一个变量k 去存储最小的数组元素下标,先让k等于第0个元素的下标0,然后用剩下的所有元素跟a[k]去比较,如果剩下的元素还有比a[k]小的,就更新k的值。一直找到数组末尾,现在我们找到的a[k]就是数组中的最小元素0了。

        那这个0,作为最小元素,是不是应该放到数组的最开始呢?所以我们让0去数组的最开始,也就是1的位置,我们交换0和1的位置就可以了。现在我们得到的数组就是a[10]={0,8,6,7,2,9,4,3,1,5}。

        如此一来,我们就找出了最小元素放到了数组的下标为0的位置,然后我们就可以不用管a[0],转而从a[1]的位置开始了。我们让k等于1,然后比较剩下的元素,再找出最小的元素1和a[1]位置的8去交换,我们的数组就变成了a[10]={0,1,6,7,2,9,4,3,8,5}。

        就这样以此类推,直到我们把倒数第二大的数放到a[8],那剩下的a[9]就肯定是最大的了,也就不需要比较了。

#include <stdio.h>
#define N 10 
main(){
	int a[10]={1,8,6,7,2,9,4,3,0,5};    //初始化数组
	int i,j,k,t;    //k作为最小元素的下标 
	for(i=0;i<N-1;i++){    //从a[0]交换到a[8],所以i从0到8,比较完a[9]就是最大的
		k=i;    //从a[i]的位置比较,i前面的已经比较过了,不再动了
		for(j=i+1;j<N;j++){    //剩下的元素循环遍历
			if(a[k]>a[j])    //遇到比a[k]还小的元素
				k=j;    //更新k的值
		}
		t=a[i];    //把最小元素放到应该去的地方
		a[i]=a[k];
		a[k]=t;
	} 
	
	for(i=0;i<10;i++)
		printf("%d ",a[i]);    //循环输出
} 

可以看这个动图理解一下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值