排序逻辑
1.给定长度为N的数组
2.[0]~[0]范围上,自然有序
3.[0]~[1]范围上,[1] 位置值若小于[0]位置,则交换
4.[0]~[2]范围上,[2] 位置值若小于[1]位置,则交换[1]和[2];交换后判断[1]位置值若小于[0]位置值则交换
5.以此类推…
代码
public static int[] insert(int[] arr){
for (int i = 1; i < arr.length;i++){
// j从i-1的位置开始,如果j位置大于j+1位置,则交换(当前位置i为j+1)
for (int j = i-1; j >= 0 && arr[j] > arr[j+1];j--){
swap(arr,j);
}
}
return arr;
}
private static void swap(int[] arr,int j) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
复杂度分析
- 时间复杂度
- 如果数组原本是有序递增的,每个循环进来只是做个比较,没有实际的交换操作
- 如果数组原本是倒序的,那么每个循环进来都要交换一次
- 最好时:O(n)
- 最差时:O(n^2)
- 时间复杂度按照最差情况来:O(n^2)
- 额外空间复杂度
- 循环过程中额外定义了有限个变量,所以额外空间复杂度为O(1)