推导:
public static void selectSort(int[] arr){
// 第一轮
int minIndex = 0;
int min = arr[0];
for (int j=0+1;j<arr.length;j++){
if (min>arr[j]){
min=arr[j];
minIndex=j;
}
}
//交换
if (minIndex!=0){
arr[minIndex]=arr[0];
arr[0]=min;
}
System.out.println("第一轮后");
System.out.println(Arrays.toString(arr));
//第二轮
minIndex = 1;
min = arr[1];
for (int j=1+1;j<arr.length;j++){
if (min>arr[j]){
min=arr[j];
minIndex=j;
}
}
//交换
if (minIndex!=1){
arr[minIndex]=arr[1];
arr[1]=min;
}
System.out.println("第二轮后");
System.out.println(Arrays.toString(arr));
//第三轮
minIndex=2;
min=arr[2];
for (int j=2+1;j<arr.length;j++){
if (min>arr[j]){
min=arr[j];
minIndex=j;
}
}
if (minIndex!=2){
arr[minIndex]=arr[2];
arr[2]=min;
}
System.out.println("第三轮后");
System.out.println(Arrays.toString(arr));
}
基本实现
public static void selectSort1(int[] arr){
int min=0;
int minIndex=0;
//一共arr.length-1轮排序
for(int i=0;i<arr.length-1;i++){
//记录当前轮的最小值,假定为当前需排序数组首位arr[i]
min=arr[i];
minIndex=i;
for(int j=i+1;j<arr.length;j++){
//寻找后面排序的最小值
if(min>arr[j]){
min=arr[j];
minIndex=j;
}
}
//交换当前轮排序数组首位与最小值的位置
if(minIndex!=i){
arr[minIndex]=arr[i];
arr[i]=min;
}
}
}
测试
public static void main(String[] args) {
int[] arr=new int[80000];
for (int i=0;i<80000;i++){
arr[i] = (int) (Math.random()*8000000);
}
long start1=System.currentTimeMillis();
selectSort1(arr);
long end1=System.currentTimeMillis();
System.out.println("选择排序算法时间:"+(end1-start1));
}
和冒泡排序相比,它们的时间复杂度都是O(n2),但是在实际代码运行时间中选择排序的时间明显减少