选择排序(Select Sort)的思想是,在比较开始前将最小值假定为第一个数,在每轮循环的比较中找出最小的那个数,将其放到数组的前面。
Java代码:
public class SelectSort {
public static void main(String[] args) {
int[] array = {7,5,3,8,4,1,3,61,13,31,11,3};
System.out.println("选择排序前:");
for(int arr:array){
System.out.print(arr+" ");
}
//为选择排序定义一个最小值的索引minIndex=0,即第一个数
int minIndex = 0;
for(int i = 0; i <array.length ;i ++){
//从第二个数开始判断,将最小数的索引记录下来,因为前者的已经排序好了
for(int j = i + 1;j < array.length;j ++){
//如果其他的数小于第一个数,那么将这个数的索引和值记录下来
if(array[j] < array[minIndex]){
//将最小数的索引j赋值给minIndex
minIndex = j;
}
}
//将最小数和第1个数交换(第2、3、4、、、)
int temp = array[minIndex];
array[minIndex] = array[i];
array[i] = temp;
//将最小数的索引假定为第i+1个
minIndex = i + 1;
}
//输出选择排序的结果
System.out.println("\n"+"选择排序的结果为:");
for(int arr:array){
System.out.print(arr+" ");
}
}
}
结果:
动画演示:
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
思考:
1、选择排序和冒泡排序的时间复杂度都为O(N^2),但是没一轮循环只需要交换一个数,而冒泡排序在每一轮循环都要交换至少一个数,所以选择排序在时间上会优于冒泡排序。
2、选择排序需要指定第1个数为最小数,在循环完后,将第一个数与真正的最小数交换,第二轮循环要假设第2个数为最小数,而不是第1个数为最小数,因为已经判断完了,第1个数一定是最小数了,接下来的循环也同理,每次循环前要将最小数的索引往后推移一位。