原理:
选择排序改进了冒泡排序,每次遍历列表只做一次交换,为了做到这一点,一个选择排序在遍历时寻找最大的值,并在完成遍历后,将其放到正确的地方。第二次遍历,找出下一个最大的值。遍历n-1次排序n个项,最终项必须在n-1次遍历之后。
思路:
(1)第一趟排序,在待排序数据arr[1],arr[2]…arr[n]选出最小的数据,将其与arr[1]进行交换。
(2)第二趟排序:在待排序的arr[2],arr[3]…arr[n]中选出最小的元素与arr[2]进行交换;
…
(3)如此继续。第i趟在待排序数据arr[i],arr[i+1]…arr[n]中选出最小的元素与其进行交换,直至全部完成。
第1趟从Arr[0]~Arr[n-1]中选取最小值,与Arr[0]交换。
第2趟从Arr[1]~Arr[n-1]中选取最小值,与Arr[1]交换。
第3趟从Arr[i-1]~Arr[n-1]中选取最小值,与Arr[i-1]交换。
举例:
public static void main(String[] args) {
int[] arr = new int[]{65, 89, 12, 40, 8, 76, 53, 42, 19, 100, 86, 201, 97};
selectSort(arr);
}
/**
* @return void
* @Author Hxx
* @Description //TODO 选择排序
* @Date 10:55 2020/5/21
* @Param [arr]
**/
public static void selectSort(int[] arr) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < arr.length; i++) {
// 每一轮假设的最小值的下标,一般取当前轮数的值
int minIndex = i;
int minNum = arr[i];
// 开始遍历查找本轮最小值的下标
for (int j = i + 1; j < arr.length; j++) {
// 判断当前假设的最小值是否比遍历找到的值小
if (arr[j] < minNum) {
// 若遍历找到的值比当前假设的值小,则进行交换
minIndex = j;
minNum = arr[j];
}
}
// 判断是否找到了最小值
if (minIndex != i) {
arr[minIndex] = arr[i];
arr[i] = minNum;
}
System.out.print(arr[i]+"\t");
}
long endTime = System.currentTimeMillis();
System.out.println();
System.out.println("选择排序执行前系统毫秒值:" + startTime);
System.out.println("选择排序执行后系统毫秒值:" + endTime);
System.out.println("算法执行时间:" + (endTime - startTime));
}
比较两个相邻的元素,将值大的元素交换到右边
算法复杂度
时间复杂度: O(N^2)
空间复杂度: O(1)
稳定性:不稳定