- 1. 选择排序的介绍
- 2. 选择排序的特点
- 3. 选择排序的程序实现
选择排序(select sorting)的基本思想是:第一次从arr[0] ~ arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1] ~ arr[n-1]中选取最小值,与arr[1]交换,…,第n-1次从arr[n-2] ~ arr[n-1]中选取最小值,与arr[n-2]交换。总共通过n-1次,得到一个按排序码从小到大排列的有序序列
虽然选择排序和冒泡排序的时间复杂度都是 O ( n 2 ) O(n^2) O(n2),但选择排序对数组的值替换次数少很多,所以执行速度更快
2. 选择排序的特点-
算法完成需要n - 1趟排序,按照算法的描述,n - 1趟排序之后数组中的前n - 1个元素已经处于相应的位置,第n个元素也处于相应的位置上
-
第i趟排序,实际上就是需要将数组中第i个元素放置到数组的合适位置,这里需要一个临时变量min来遍历序列中未排好的那些元素,另一临时变量minIndex来记录未排好序的那些元素中值最小的元素的下标值
-
一趟遍历开始时,令minIndex = i,假定未排序序列的第一个元素就是最小的元素,遍历完成后,变量minIndex所对应的值就是值最小的元素,判断minIndex是否是未排序序列的第一个元素,如果是,则不需要交换元素,如果不是,则需要交换array[minIndex]和array[i]
-
此方法是不稳定排序算法
-
此方法移动元素的次数比较少,但是不管序列中元素初始排列状态如何,第i趟排序都需要进行n - i次元素之间的比较,因此总的比较次数为1 + 2 + 3 + 4 + 5 + … + n - 1 = n(n-1)/2
需求:有一组无序的数据{101, 34, 119, 1, -1, 90, 123},请用选择排序算法实现从小到大排列
程序实现:
import java.util.Arrays;
public class SelectSort {
public static void main(String[] args) {
int[] arr = {101, 34, 119, 1, -1, 90, 123};
selectSort(arr);
System.out.println("排序后:");
System.out.println(Arrays.toString(arr));
}
// 选择排序
public static void selectSort(int[] array) {
// 选择排序时间复杂度是O(n^2)
// 用于控制遍历多少轮
for (int i = 0; i < array.length - 1; i++) {
// 假设当前index的值是最小值
int minIndex = i;
int min = array[i];
// 用于控制在一轮中,遍历多少次
for (int j = i + 1; j < array.length; j++) {
// 如果找到的值比当前值还小,则将最小值置为找到的值
if (min > array[j]) {
min = array[j];
minIndex = j;
}
}
// 一轮遍历完成后,如果最小值的index和当前index不一样,则进行最小值的替换
if (minIndex != i) {
array[minIndex] = array[i];
array[i] = min;
}
}
}
}
运行程序,结果如下:
排序后:
[-1, 1, 34, 90, 101, 119, 123]