选择排序的步骤如下。
(1) 从左至右检查数组的每个格子,找出值最小的那个。
在此过程中,用一个变量来记住检查过的数字的最小值(事实上记住的是索引)。
如果一个格子中的数字比记录的最小值还要小,就把变量改成该格子的索引
(2) 每一轮检查完,知道哪个格子的值最小之后,将该格与本轮检查的起点交换。
第 1 轮检查的起点是索引 0,第 2 轮是索引 1,以此类推。
冒泡排序直接比较交换未排序的相邻的两个值;而选择排序先检查未排序的起始索引值与其它值(记录最小值索引),检查完毕之后再将起始值与最小值进行交换(每一轮检查交换结束,最小值总是在起始位值)。
在完全逆序的情况下,冒泡排序每一轮的每一次检查之后都要做交换元素的动作,而选择排序则在每一轮检查完毕之后再进行元素的交换。
package com.sort;
/**
* @author: jk
* @since: 2020-03-20 01:10
* <p>
* 选择排序
* </p>
**/
public class selection_sort {
public static void main(String[] args) {
int[] list = {65, 55, 45, 35, 25, 15, 10};
// int[] sortList = selectionSort(list);
int[] sortList = selectionSort2(list);
for (int i = 0; i < sortList.length; i++) {
System.out.println(sortList[i]);
}
}
private static int[] selectionSort(int[] array){
for (int i = 0; i < array.length; i++) {
// 1 记住最小值的索引
int lowestIndex = i;
// 2 将array[i] 与它后面的所有元素比较
for (int j = i + 1; j < array.length; j++) {
// 将 lowestIndex 更新为最小值的索引
if (array[j] < array[lowestIndex]){
lowestIndex = j;
}
}
// 3 比较完之后,如果 lowestIndex 有更新,则交换元素
if (lowestIndex != i){
int temp = array[i];
array[i] = array[lowestIndex];
array[lowestIndex] = temp;
}
}
// 4 循环完毕,即排序完成。
return array;
}
}