首先我们先要了解选择排序的思路哦
比如我这里有一个数组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]); //循环输出
}
可以看这个动图理解一下