算法思路

第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。

算法分析
  1. 不稳定排序
  2. 时间复杂度;乱序:O(N^2)
  3. 空间复杂度:O(1)
算法实现
/**
* @Description: 排序算法 -- 选择排序
* @Author: Kevin
* @CreateDate: 2019/7/13 23:35
* @UpdateUser: Kevin
* @UpdateDate: 2019/7/13 23:35
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
public class SelectSort {

public static void main(String[] args) {
int[] arr = { 16, 1, 0, 9, 100 };
int[] b = selectSort(arr);
for(int i : b){
System.out.println(i);
}
}

/**
* 选择排序
* @param array
* @return
*/
public static int[] selectSort(int[] array){
int length = array.length;
System.out.println("length:"+length);
//找出最小下标
//外层循环控制比较的趟数 ---> length - 1
for(int i = 0;i<length-1;i++) {
//最小下标
int minIndex = i;
//内层循环控制每一趟比较的比较次数 ---> length - i
//自己不用跟自己比,j = i + 1
for (int j = i+1;j < length; j++) {
//跟最小下标对应数比较
if (array[j] < array[minIndex]) {
minIndex = j;
}
}
//将找到的最小值和i位置所在的值进行交换
if (i != minIndex) {
int tmp = array[i];
array[i] = array[minIndex];
array[minIndex] = tmp;
}
}
return array;
}
}

和冒泡排序不同,这个交换在外层循环的时候进行交换,而不是和冒泡排序一样每次内层循环判断都要交换。

从这个交换方式可以看出,每次交换是循环开始的元素与选择出来最小或最大的元素交换,也就是说每次交换之后都会把选择出来的元素放到前面排序好元素的后面。