插入排序
思想:将一个需要排序的数字与他之前的数字进行比对,如果条件达成就进行插入,则再次进行循环比对
或许在本章开始之前,应该先看一下插入排序的图解:
这里你也可以理解成平时在玩的扑克牌;在每一次拿到一张新的牌的时候,都会和前面的牌进行对比,直到一个合适插入的位置
算法解读
第一步:(初始化)先创建两个变量;它们的作用是存储要插入的数值和需要进行对比数据的下标
第二步:对需要进行排序的数组进行遍历
第三步:这里要获取到第二个值,因为在排序的时候,需要一个值和另一个值的对比,所以要获取到第二个值通过i(也就是前一个数组的下标)和前一个值进行对比,这里的i=j-1也就是要取到上一个值
第四步:通过while loop来进行数据的对比,直到不复合条件跳出循环
第五步:当找到了一个合适的位置就将所要排序的key放到对应的位置,就完成的排序
static Integer[] sort_asc(Integer... array) {
int key = 0, i = 0;
for (int j = 1; j < array.length; j++) {
key = array[j];
i = j - 1;
while (i >= 0 && array[i] > key) {
array[i + 1] = array[i];
i = i - 1;
}
array[i + 1] = key;
}
return array;
}
看下面的程序应该是很好理解的,在下面code中的while loop里面还有一个i=i-1,这个代码存在的原因是需要插入的数前面和前面的前面的数都有可能在while循环时条件为true.(图示)
复杂度
对于插入排序算法它更好的适用于数据元素比较少的情况,它的时间复杂度在最优的情况下量O(n),最坏的情况是O(n^2)
- 在最优的时候,需要排序的数只要和前的数进行比较一下就可以了
- 在最坏的时候,就是这个数组完全是逆序的.比如有一个数组是[9,8,5,4,3,2,1],需要将它给排好序[1,2,3,4,5,8,9],所以这个是最坏的情况