经典排序之选择排序
选择排序(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²),在稳定性方面是不稳定的。
【注:关于排序中的稳定性,请参考本博中的“经典排序之插入排序”文章】