排序思路:
找到当前数组中最小元素,放在数组首位,然后刨去首位,在剩下的待排序元素中查找最小元素,放于首位后面。如此往复,将每次查找到的最小元素逐个按序放在数组最前端,直到排序完成。
举例:
{22,35,16,9,5,20}
1)我们设a[0]为初始最小值,把其与其后的元素一起比较,找出最小值5。交换22与5。
{5,35,16,9,22,20}
2)现在5已经排好了。继续把观察点向后移动,将初始最小值定为35,把其与其后的元素一起比较,找出最小值9,交换35与9。
{5,9,16,35,22,20}
3)重复上述步骤:
{5,9,16,35,22,20} (观察点a[2],不换)
{5,9,16,20,22,35} (观察点a[3],35<->20)
{5,9,16,20,22,35} (观察点a[4],不换)
{5,9,16,20,22,35} (观察点a[5],不换)
4)结果:
{5,9,16,20,22,35}
c实现:
void selectSort(int array[], int len){
int tmp,min_val,index_of_min;
int i=0;
for(; i<len; i++){
tmp = array[i];//把首位先空出来,用于存放每一轮比较出的最小值
int j=i;//每一轮比较的起始点
min_val = array[i];//设最小值为每轮的第一个值
index_of_min = j;//记录最小值的索引
for(; j<len; j++){
if(array[j]<min_val){
//找到小于当前最小值的元素,更新最小值并记录索引
min_val = array[j];
index_of_min = j;
}
}
//本轮结束,将最小值与首位交换
array[i]=min_val;
array[index_of_min]=tmp;
}
}
时间复杂度为O(n2)