选择排序
表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2) 的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小元素,存放到已排序序列的末尾,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
算法描述
n个记录的直接选择排序可经过 n-1 趟直接选择排序得到有序结果。
具体算法描述如下:
- 初始状态:无序区为R[1..n],有序区为空;
- 第 i 趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
- n-1趟结束,数组有序化了。
算法分析
- 时间复杂度
- 平均情况:O(n2)
- 最好情况:O(n2)
- 最坏情况:O(n2)
- 空间复杂度: O(1)
- 稳定性:不稳定
代码实现
public class SelectionSort {
public static void selectSort(int[] arr) {
// 空数组 或 只有一个元素的数组,则什么都不做。
if (arr == null || arr.length == 1) return;
// 外层循环的 i 表示无序区的第一个元素的索引。
for (int i = 0; i < arr.length - 1; i++) {
// minIndex是最小元素的索引。
int minIndex = i;
// 找到最小元素的索引值,赋给minIndex.
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 交换元素
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
// 把每一趟排序的结果也输出一下。
System.out.print("第 "+ (i+1) + " 趟: ");
print(arr);
}
}
public static void main(String[] args) {
int[] arr = {6, 9, 1, 4, 5, 8, 7, 0, 2, 3};
System.out.print("排序前: ");
print(arr);
selectSort(arr);
System.out.print("排序后: ");
print(arr);
}
// 打印数组
public static void print(int[] arr) {
if (arr == null) return;
for(int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
}
/*
排序前: 6 9 1 4 5 8 7 0 2 3
第 1 趟: 0 9 1 4 5 8 7 6 2 3
第 2 趟: 0 1 9 4 5 8 7 6 2 3
第 3 趟: 0 1 2 4 5 8 7 6 9 3
第 4 趟: 0 1 2 3 5 8 7 6 9 4
第 5 趟: 0 1 2 3 4 8 7 6 9 5
第 6 趟: 0 1 2 3 4 5 7 6 9 8
第 7 趟: 0 1 2 3 4 5 6 7 9 8
第 8 趟: 0 1 2 3 4 5 6 7 9 8
第 9 趟: 0 1 2 3 4 5 6 7 8 9
排序后: 0 1 2 3 4 5 6 7 8 9
*/