一、选择排序的思想
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
下面,看个例子吧:(这里举例从小到大排序)
初始序列为:9 3 2 5 4 7 6 0 1 8
第一次选择通过两两比较从这10个数中选出最小的与第一位交换
第二次选择也利用上面的方法先选出2-10这9个数中最小的然后与第二位交换
.........按上面的方法依次选择排序
第九次选择后,我们就能得到最终的结果了:0 1 2 3 4 5 6 7 8 9
总结一下上面的例子吧,(当有n个元素时)1.我们要经过n-1次选择才能排好 2.每次选择需要在剩下的序列里进行两两比较,选出最小的。
二、编程
定义一个变量min,用来记录找到的最小值的下标,然后,每趟找完最小值之后,将最小值与相应位置的值作交换就可以了。
下面看一下代码实现吧。(环境:vs2010 语言:c语言)
#include <stdio.h>
#include <stdlib.h>
void SelectSort(int* arr, int len)
{
int i = 0;
int j = 0;
for(i = 0; i < len-1; i++) //控制选择的趟数
{
int tmp;
int min = i;
for(j = i+1; j < len; j++) //控制每趟选择比较的次数
{
if(arr[min] > arr[j])
{
min = j;
}
}
tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
int main()
{
int i = 0;
int array[10] = {9, 3, 2, 5, 4, 7, 6, 0, 1, 8};
SelectSort(array, sizeof(array)/sizeof(int));
for(i = 0; i < sizeof(array)/sizeof(int); i++)
{
printf("%d ",array[i]);
}
printf("\n");
system("pause");
return 0;
}
三、选择排序与冒泡排序的区别:
1.首先,选择排序是通过两两比较将最小(或最大)值标记出来,然后与前面相应位置进行交换;而冒泡排序是通过两两比较将不符合要求的交换使最大(或最小)值到后面。
2.选择排序优于冒泡排序的在于它交换数据次数少,先不急于调换位置,先从arr[0]开始逐个检查,看哪个数最小就记下该数所在的位置min,等一躺扫描完毕,再把arr[min]和arr[0]对调,这时arr[0]到arr[9]中最小的数据就换到了最前面的位置。
这个是冒泡排序的链接点击打开链接,有兴趣的童鞋可以点进去看一下哦!!
谢谢阅读,祝大家每天都开开心心哒 ^_^