选择排序的思路是这样的:首先,找到数组中最小的数据,拎出来,将它和数组的第一个数据交换位置,第二步,在剩下的数据中继续寻找最小的数据,拎出来,和数组的第二个数据交换位置,如此循环,直到整个数组排序完成。
我们还是以[8,2,5,9,7]这组数字做例子。
第一轮选择,先找到数组中最小的数字2,然后和第一个数字交换位置。
第二轮选择,由于数组第一个位置已经是有序的,所以只需要查找剩余位置,找到其中最小的数字5,然后和数组第二个位置的数据交换。
第三轮选择,找到最小值7,和第三个位置的数据交换位置。
第四轮选择,找到最小值8,和第四个位置的数据交换位置。
最后一个到达了数组末尾,没有可对比的数据,结束选择。
如此整个数组就排序完成了。
# include <stdio.h>
int main(void)
{
int i, j; //循环变量
int MinIndex; //保存最小的值的下标
int buf; //互换数据时的临时变量
int a[] = {5, 5, 3, 7, 4, 2, 5, 4, 9, 1, 8, 6};
int n = sizeof(a) / sizeof(a[0]); //存放数组a中元素的个数
for (i=0; i<n-1; ++i) //n个数比较n-1轮
{
MinIndex = i;
for (j=i+1; j<n; ++j) //每轮比较n-1-i次, 找本轮最小数的下标
{
if (a[MinIndex] > a[j])
{
MinIndex = j; //保存小的数的下标
}
}
if (MinIndex != i) /*找到最小数之后如果它的下标不是i则说明它不在最左边, 则互换位置*/
{
buf = a[MinIndex];
a[MinIndex] = a[i];
a[i] = buf;
}
}
printf("最终排序结果为:\n");
for (i=0; i<12; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}