插入排序
思想
数组中依次遍历,从左到右(反过来也可以,只是很少有人那么干),遍历的第一个元素,假定为有序的,从第二个开始,依次和左侧的数进行比较,根据比较规则进行替换,就这样依次作比较,最终得出一个有序的数组
代码:java实现
public static int[] doInsertSort(int[] array) {
if(array.length <= 1) return array;
for (int i = 1; i < array.length; i++) {
int curr = array[i] ;
for(int j = i-1 ; j >= 0 ; j--) {
if(array[j] > curr ) {
array[j+1] = array[j];
array[j] = curr ;
}
}
}
return array;
}
分析
时间复杂度
在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为O(N)
最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(N2)
平均来说,A[1…j-1]中的一半元素小于A[j],一半元素大于A[j]。插入排序在平均情况运行时间与最坏情况运行时间一样,是输入规模的二次函数
空间复杂度
插入排序的空间复杂度为常数阶O(1)
举一反三:字母排序
题目:给一个字符串,根据ASCII进行排序
代码
public static String doInsertSort(String array) {
if(array.length() <= 1) return array;
for (int i = 1; i < array.length(); i++) {
char curr = array.charAt(i) ;
for(int j = i-1 ; j >= 0 ; j--) {
if(array.charAt(j) > curr ) {
array = array.substring(0,j)
+ array.charAt(j+1)
+ array.charAt(j)
+ array.substring(j+2,array.length());
}
}
}
return array;
}
运行结果
其实把一个无序数组作为字符串,也可以按照字母排序实现要求