echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075) 交流学习。
什么是选择性排序?
选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。
动图演示
声明图片来源于菜鸟教程
Java代码实现
public class Test {
public static void main(String[] args) {
int[] arr = {1, 3, 6, 9, 2, 5, 11, 4, 8};
print("原数组: ", arr);
selectionSort(arr);
print("排序后的数组: ", arr);
}
private static void selectionSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (i != min) {
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
}
private static void print(String str, int[] arr) {
for (int i = 0; i <= arr.length - 1; i++) {
if (i == 0) {
System.out.print(str + "[" + arr[i] + ", ");
} else if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ", ");
}
}
System.out.println();
}
}
核心原理
选择排序很明显的一个特点就是和冒泡排序一样,都是双层循环。第一层循环就是负责拿到每一个元素,第二层循环则使用第一层循环的数据,不断的进行比对,找到最小的元素,然后和第一层循环拿到的元素进行交换。算法过程中比对的数据集也是在不断变小。
算法过程如下
- 原始数据集:{1, 3, 6, 9, 2, 5, 11, 4, 8}
- 第1次排序过程:[1,] 3, 6, 9, 2, 5, 11, 4, 8
- 第2次排序过程: [1, 2,] 3, 6, 9, 5, 11, 4, 8
- 第3次排序过程: [1, 2, 3,] 6, 9, 5, 11, 4, 8
- 第4次排序过程: [1, 2, 3, 4,] 6, 9, 5, 11, 8
- 第5次排序过程: [1, 2, 3, 4, 5.] 6, 9, 11, 8
- 第6次排序过程: [1, 2, 3, 4, 5, 6,] 9, 11, 8
- 第7次排序过程: [1, 2, 3, 4, 5, 6, 8,] 9, 11
- 第8次排序过程: [1, 2, 3, 4, 5, 6, 8, 9,] 11
- 第9次排序过程: [1, 2, 3, 4, 5, 6, 8, 9, 11]
时间复杂度
O(n^2)
选择排序的优缺点
缺点:时间复杂度太高,效率慢;最关键的是不稳定(举个例子:8, 3, 6, 9, 1, 5, 11, 4, 2,这里面的数据假如我第一次选择,8和1的位置会互换,这个时候,8就到了9的后面。
优点:一轮比较只需要换一次位置;
怎么区分冒泡和选择
很多人对冒泡和选择这种算法很难分清,却是从实现和基本的过程,数据集都差不了多少。
- 区分两种算法的关键就在于他们一次循环交换了几次位置,冒泡可以交换很多次位置,但是选择排序值交换一次位置。
- 选择排序会破坏原有序列的顺序,冒泡不会。