一、概念:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是非稳定排序算法。
二、算法思路:
1、先设定一个变量,并且把所需排列的数据中第一个的值赋给该变量;
2、将该变量与剩下数据挨个进行比较,选出最小(或最大)的一个值,与 第一个数据交换位置;
3、然后把第二个数据的值赋给变量,将该变量与剩下的数据进行比较,选出最小(或最大)的值,与第二个数据交换位置;
4、重复进行上述操作,直至最后一个数据,排序结束。
三、优缺点:
优点:主要与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
缺点:与其他排序方法相比较,相对还是慢。
四、代码实现:
#include <stdio.h>
void my_printf(int *v , int n) //输出数据
{
int i;
for(i = 0 ; i < n ; i ++)
{
printf("%d ", v[i]);
}
printf("\n");
}
void choose(int *v , int n)
{
int i;
int j;
int tmp; //记录最小数的下标
int total; //与所需排列数据挨个进行比较的变量
for(i = 0 ; i < n ; i ++)
{
total = v[i];
tmp = i;
for(j = i ; j < n ; j ++)
{
if(v[j] < total)
{
total = v[j];
tmp = j;
}
}
v[tmp] = v[i];
v[i] = total;
}
}
int main()
{
int a[] = {5 , 9 , 1 , 7 , 3 , 2 , 6 , 8 , 4};
my_printf(a , (sizeof(a)/sizeof(a[0])));
choose(a , (sizeof(a)/sizeof(a[0])));
my_printf(a , (sizeof(a)/sizeof(a[0])));
return 0;
}
运行结果:
五、复杂度:
时间复杂度:O(n );
空间复杂度:O(1)。