选择排序的原理就是上图表示的内容。
老样子,我们还是举个例子:1 3 5 8
首先遍历元素,找到最大或者最小的元素,这里我选择最小的元素1,然后放到数组的一侧,可以放到左侧,也可以放到右侧,这里我放到右侧。然后数组变成8 3 5 1,然后继续遍历,继续找到最小的元素3,然后放到右侧最小元素的前一个位置,此时变成8 5 3 1,此时就排序完成了。原理很简单。上代码。同样的,你也可以在中间加个判断,如果已经排好序了,就可以停止了。代码为了照顾新手,就不那么复杂了,大家可以自己优化一下代码。
代码实现:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int sz[] = {6,1,3,5,8,9,4,4,2}; //定义一个待排序的数组
int sz_len = sizeof(sz)/sizeof(sz[0]); //求出数组长度
int i;
int y_xb = sz_len-1; //数组最右侧的下标
for(i = 1;i < sz_len;i++) //开始排序,排序要进行的轮数 9个数,最多要排八次
{
//用来找到最小的数,让这里我们选择最小的数,放到右侧
int min_num = sz[0];
int min_numxb = 0; //记录最小数的下标
//先遍历,找到最小的元素
int j;
for(j = 0;j <= y_xb;j++) //y_xb是未排序的下标
{
if(min_num > sz[j])
{
min_num = sz[j]; //比min_num小,然后赋值
min_numxb = j; //记录下标
}
}
//然后交换
int temp = sz[y_xb]; //临时变量存放最右的元素
sz[y_xb] = sz[min_numxb]; //最右侧的元素换成最小元素
sz[min_numxb] = temp; //最小元素的位置存放最右侧的元素
y_xb --; //然后最右侧下标--,变成倒数第二个,依次往下减少
}
//打印看看
int k;
for(k = 0;k < sz_len;k++)
{
printf("%d ",sz[k]);
}
return 0;
}