简要描述和分析,做记录用。
算法说明
找到数组中的最小元素,将它和数组的第一个元素交换交换位置(如果第一个元素就是最小元素,那么它就和自己交换);在剩下的元素中找到最小的元素,将它与数组的第二个元素交换。如此往复,直到将整个数组排序,这种排序算法叫做选择排序
,因为它在不断地选择剩余元素之中的最小元素。
总的来说,选择排序是一种很容易理解和实现的简单排序算法,它有两个鲜明的特点。
- 运行时间和输入无关。
在找出最小元素而扫描一遍数组并不能为下一边扫描提供任何信息,在使用选择排序的时候,你会发现,一个已经有序的数组或者是所有元素都相等的数组和一个元素随机排列的数组所用的排序时间一样长
。 - 数据移动是最少的。
每次交换都会改变两个元素的值,因此选择排序用了N次交换-----交换次数和数组的大小是线性关系。
算法实现
选择排序算法
void select_sort(int *array, int len)
{
int i, j;
for(i=0; i<len; i++)
{
int min = i; //最小元素的索引
int tmp;
/*将a[i]中的元素与a[i+1..len]中最小的元素交换*/
for (j = i+1; j<len; j++)
{
if(array[j] < array[min]) min = j; //交换最小元素的索引值
}
/*将a[i]的数值与最小的元素值进行交换*/
tmp = array[i];
array[i] = array[min];
array[min] = tmp;
}
}
主程序
#include <stdio.h>
void print_array(int *array, int len)
{
int i;
for (i = 0; i < len; ++i)
{
printf("%d ", array[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
int array[10] = {3, 33, 22, 12, 5, 26, 10, 1, 52, 7};
int i;
int len = sizeof(array)/sizeof(array[0]);
printf("排序前:\n");
print_array(array, len);
select_sort(array, len);
printf("排序后:\n");
print_array(array, len);
return 0;
}
运行效果