原理
1、每一次遍历的过程中, 都假定第一个索引出的元素是最小值,和其他索引处的值依次进行比较, 如果当前索引处的值大
于其他某个索引处的值,则假定其他某个索引处的值为最小值, 最后开源找到最小值所在的索引.
2、交换第一个索引处和最小值所在的索引处的值
选择排序实现类
public class Selection {
/**
* 对数据a中的元素进行选择排序
* @param a
*/
public static void sort(Comparable[] a){
for (int i = 0; i < a.length -1; i++) {
// 定义一个变量, 记录最小元素所在的索引, 默认为参与选择排序的第一个元素所在的位置
int minIndex = i;
for (int j = i + 1; j < a.length; j++) {
// 需要比较最小索引处minIndex处的值和j索引处的值;
if (greater(a[minIndex], a[j])) {
minIndex = j;
}
}
// 交换最小元素所在索引minIndex处的值和索引i处的值
exchange(a, i , minIndex);
}
}
/**
* 比较v元素是否大于w元素
* @param v
* @param w
* @return
*/
private static boolean greater(Comparable v, Comparable w){
return v.compareTo(w) > 0;
}
/**
* 数据元素i和j交换位置
* @param a
* @param i
* @param j
*/
private static void exchange(Comparable[] a, int i, int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
测试类
public static void main(String[] args) {
// 初始值
Integer[] a = {4,6,8,7,9,2,10,1};
Selection.sort(a);
// 期望值: [1, 2, 4, 6, 7, 8, 9, 10]
System.out.println(Arrays.toString(a));
}
时间复杂度
使用了双层for循环, 其中外层循环完成了数据交换, 内层循环完成了数据比较
数据比较次数
(N-1) + (N-2) + (N - 3) + .... + 2 + 1 = ((N-1)+1) * (N-1)/2=N^2/2-N/2;
元素交换的次数;
N-1
总执行次数为:
(N^2/2-N/2) + (N-1) = N^2 -N;
按照大O记法, 冒泡排序的时间复杂度为O(N^2)
使用场景: 适用于数据量不大的排序