排序逻辑
1.给定一个数组,假设长度为N
2.选择逻辑:每次选择范围上的最小值,与当前范围的第一个位置交换
3.第一步:在[0]~[N-1]范围上找到最小值,与[0]位置进行交换
4.第二步:在[1]~[N-1]范围上找到最小值,与[1]位置交换
5.第三步:在[2]~[N-1]范围上找到最小值,与[2]位置交换
6. 以此类推…
代码
public static int[] selection(int[] arr) {
if (arr == null || arr.length == 1){
return arr;
}
//外层for循环,控制选择范围0~N-1,1~N-1.....
for (int i = 0; i < arr.length; i++) {
//寻找范围上最小值,放到i位置上
int minIndex = i;
for (int j = i+1;j<arr.length;j++){
//如果当前值小于arr[i],则将当前值的索引赋给minIndex
minIndex = arr[minIndex] > arr[j] ? j : minIndex;
}
swap(arr,i,minIndex);
}
return arr;
}
private static void swap(int[] arr, int i, int minIndex) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
复杂度分析
时间复杂度
- 分析常数操作
- 在一次循环内,对当前数要进行两个操作:看当前数的值,和保存的最小值做个比较
- 一次循环结束后,保存的最小值位置与范围内第一个位置做交换
- 在[0]~[n-1]范围内,一共有n个数,执行的操作数是 2*(n)+1
- 在[1]~[n-1]范围内,一共有n-1个数,执行的操作数是 2*(n-1)+1
- 在[2]~[n-1]范围内,一共有n-2个数,执行的操作数是 2*(n-2)+1
- 以此类推…
- 总操作数
- 2* (n+n-1+n-2+…+1) + n -----> 2(an²+bn+c)+n
- 时间复杂度
- 去掉低阶项
- 去掉常数系数
- O(n^2)
额外空间复杂度
- 循环过程中使用了有限个变量,所以额外空间复杂度为O(1)