一、概念:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是非稳定排序算法。
二、算法思路:
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)。