1. 选择排序
1.1 排序原理
- 将数组分为两个区间,一个有序区间,一个无序区间。开始默认数组为无序区间;
- 从无序区间取最小的一个元素,将最小的元素与无序区间的第一个元素交换位置,即插入有序区间的末尾;
- 重复这个过程,直到无序区间没有元素;
1.2 性能分析
1.2.1 执行效率
- 最小时间复杂度:数据完全有序时,只需进行一次遍历操作即可,时间复杂度是O(n^2);
- 最大时间复杂度:数据倒序排序时,需要n次插入操作,时间复杂度是O(n^2);
- 平均情况复杂度:时间复杂度是O(n^2);
1.2.2 空间复杂度
每次交换仅需1个临时变量,故空间复杂度为O(1),是原地排序算法。
1.2.3 算法稳定性
假设数组为 5 8 5 2,第一选择最小元素时前面的5被换到后面了,所以不是稳定排序。
1.3 代码实现
public static int[] selectSort(int[] a){ if (a.length <= 1) { return a; } // 默认初始数组为无序区间,从第一个元素开始排序 for (int i = 0; i < a.length; i++) { // 开始默认无序区间第一个元素最小 // temp为最小的元素 int temp = a[i]; // 最小元素的下标 int min = i; // 从无序区间的第二个元素开始进行比较 for (int j = i+1; j < a.length; j++) { // 有元素比最小元素还小,将那个元素赋给最小元素,并记录它的下标 if (temp > a[j]) { temp = a[j]; min = j; } } // 将最小元素与无序区间的第一个元素进行交换 a[min] = a[i]; a[i] = temp; System.out.println(i+" :"+Arrays.toString(a)); } return a; }