选择排序(SelectionSort)的算法思想:对于数组中n个待排序的元素,进行n-1次排序,每次选出待排序数据集中的最小数(或最大数),然后将选出的最小数(或最大数)与当前待排序数据集的首个数交换;以此类推,直到排序结束,整个待排序数组也成为有序数组。
之所以称为选择排序,意为每次选出最小或最大的数,从而完成排序。
我接下来通过代码演示:
package 排序算法.选择排序; import java.util.Arrays; /** * 选择排序 */ public class Test { static int num=0;//计算排序次数 static void selectSort(int[] arr){ System.out.println("排序前:"+ Arrays.toString(arr)); for(int i=0;i<arr.length-1;i++){ int k=i;//选择最小的数放在首位 for(int j=k+1;j<arr.length;j++){ if(arr[j]<arr[k]){ k=j; } } if(i!=k){ int temp=arr[i]; arr[i]=arr[k]; arr[k]=temp; System.out.println("第"+(++num)+"次排序:"+Arrays.toString(arr)); } } } public static void main(String[] args) { int[] arr=new int[]{15,32,14,86,54,78,36}; selectSort(arr); System.out.println("排序后:"+ Arrays.toString(arr)); } }
上述代码运行后的结果:
排序前:[15, 32, 14, 86, 54, 78, 36] 第1次排序:[14, 32, 15, 86, 54, 78, 36] 第2次排序:[14, 15, 32, 86, 54, 78, 36] 第3次排序:[14, 15, 32, 36, 54, 78, 86] 排序后:[14, 15, 32, 36, 54, 78, 86]
此外,再写个优化后的选择排序:
package com.itszt.test6; import java.util.Arrays; /** * 选择排序,每次选择最小的数放在待排序部分的首位; * 如果放下剩余部分有序,则停止排序 */ public class Test3 { static int k=0; public static void main(String[] args) { int[] arr={15, 32, 14, 86, 54, 78, 36}; System.out.println("排序前:"+ Arrays.toString(arr)); selectSort(arr); System.out.println("排序后:"+ Arrays.toString(arr)); } static void selectSort(int[] arr){ boolean boo=true;//默认有序 for(int i=0;i<arr.length-1;i++){ int min=i;//选择最小的数放在待排序部分的首位 for(int j=i+1;j<arr.length;j++){ if(arr[min]>arr[j]){ boo=false;//存在无序 min=j; } } if(boo){ return; } if(min!=i){ int temp=arr[i]; arr[i]=arr[min]; arr[min]=temp; System.out.println("第"+(++k)+"次排序:"+ Arrays.toString(arr)); } } } }
最后,选择排序的平均时间复杂度为O(n²),在稳定性方面是不稳定的。
【注:关于排序中的稳定性,请参考本博中的“经典排序之插入排序”文章】