package com.test.sort;
import java.util.Arrays;
/**
* 选择排序基本思想:
* 第一轮从序列arr[0]~arr[n-1]中选择最小数,放入下标【0】
* 第二轮从剩余的序列中arr[1]~arr[n-1]选择最小数,放入下标【1】
* 依次类推,最后得到从小到大的序列
*/
public class SelectSortDemo {
public static void main(String[] args) {
int[] arr=new int[]{0,4,2,3,1};
selectSort(arr);
System.out.println(Arrays.toString(arr));
}
/**
*将数组从大到小排列
* 分析:
* 设最小值变量temp
* 第一轮:假定arr[0]为最小赋值给temp,与后面元素依次比较,若发现比temp小,则赋值给temp,
* 继续与temp比较。本轮比较完成得到最小值和下标。与arr[0]位置交换
* 第二轮:假定arr[1]为最小赋值给temp,与后面元素依次比较,若发现比temp小,则赋值给temp,
* 继续与temp比较。本轮比较完成得到最小值和下标。与arr[1]位置交换
* 依次类推,直至完成
* 总结:
* 1、共比较arr.length-1轮
* 2、每轮比较次数arr.length-当前轮数
* 3、共发生arr.length-1次数据交换
* 4、执行次数公式:f(n)=(n-1)n/2=(n²-n)/2
* 5、时间复杂度:O(n²)
* 6、同等数据量小比冒泡排序快,因为数据交换次数少,冒泡数据交换次数(n²-n)/2
*
* @param arr
*/
public static void selectSort(int[] arr){
for (int i=0;i<arr.length-1;i++){
int min=arr[i];
int minIndex=i;
for (int j=i+1;j<arr.length;j++){
if(arr[j]<min){
min=arr[j];
minIndex=j;
}
}
arr[minIndex]=arr[i];
arr[i]=min;
}
}
}