前言
通过最近的几次讲课,越来越发现了算法的重要性,冒泡,选择,插入是三种基础排序,打好基础,以便追求更高深的知识。
直接选择排序
基本思想:在第i次选择操作中,通过n-i次比较,从n-i+1个记录中选出键值最小的记录,并和地i(1<=i<=n-1)个记录交换。
可以这样理解:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。
运行过程
第一趟,假定第一个元素最小,用a(min)标记,然后和下一个元素比较,如果下一下元素小于第一个,就将标记a(min)从第一个移到下一个,然后依次和带有下标的元素比较,最后从n 个记录中找出关键码最小的记录与第一个记录交换;
第二趟,从第二个记录开始,重复上一步的步骤,从n-1 个记录中再选出关键码最小的记录与第二个记录交换;
以此类推.....
第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,直到整个序列按关键码有序。
示例
算法实现(核心代码)
public void selectionSort(int[] list)
{
// 需要遍历获得最小值的次数
// 要注意一点,当要排序 N 个数,已经经过 N-1 次遍历后,已经是有序数列
for (int i = 0; i < list.length - 1; i++)
{
int temp = 0;
int min = i; // 用来保存最小值得索引
// 寻找第i个小的数值
for (int j = i + 1; j < list.length; j++)
{
if (list[min] > list[j])
{
min = j;
}
}
// 将找到的第i个小的数值放在第i个位置上
temp = list[min];
list[min] = list[i];
list[i] = temp;
}
}
算法分析
平均时间复杂度:O(n2)
空间复杂度:O(1) ,简单选择排序需要占用 1 个临时空间,在交换数值时使用。
稳定性:不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)