选择排序是一种简单直观的排序算法,它与冒泡排序很相似,都是比较n - 1轮,每轮 n-1-i 次每轮找出一个最大/ 最小值。只不过冒泡放最后,选择排序放最左。
(本文以从小到大排序为例)
与冒泡的比较:冒泡是将相邻的数逐个进行比较:(从小到大为例)只要前面的比后面的大,就互换倆数,直到最后将最大的数“浮到”最末尾,如此循环。
而选择排序,先保存第一个元素的下标,之后所有元素与第一个比较,如果遇到最小的,则记录更小那个数的下标。直到最后将最小数的下标找出来,然后再此最小数放最左,即与下标0的元素互换位置。
先判断最小的数下标是不是0,若不是则说明第一个元素不是最小的,则此数与下标0的元素互换位置,一轮下来,最小的数放最左边。找到第二小、第三小、第... ...。
bb两小时,coding2分钟。。。
#include <stdio.h>
int main()
{
int i, j;
int MinIndex;
int buf;
int a[] = {5,8,4,65,4,8,2,4,3,7,5,4,12,78,-7,0};
int n = sizeof(a) / sizeof(a[0]);
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<n; i++)
{
printf("%d\x20",a[i]);
}
return 0;
}
不同点:冒泡排序只要碰到前面比后面大,就交换;
而选择排序一轮只交换一次,且若本轮最小的就是最左那个,就不用交换。
所以该方法更符合人类思维
更多排序方法: