「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。
插入排序
前文
插入排序是十分常见的一种排序算法,在实际的开发中会经常用到。本文为个人对于插入排序算法的一些总结,内容上难免有一些不足之处,还请见谅。
插入排序
插入排序算法整体上的思路是首先假设从排序数组最左边到当前n-1位置的数据为已排序状态。然后当对第n个数据进行排序操作时,将这个元素与前面的n-1个元素进行比较。由于前面的数据已经排序成功,因此只要找到适当的位置插入即可,不需要与剩余的元素继续进行比较。具体的操作时会将元素n左移,例如从小到大排序,那么需要找到第一个小于元素n的元素,并将元素n插入到该位置后一个位置即可。
简单看一个插入排序的代码:
public void sort(int[] list){
for (int i = 1; i < list.length; i++) {
int target = list[i];
int pos = -1;
for (int j = i - 1; j >= 0; j--) {
if(list[j] >= target && j >= 0){
list[j + 1] = list[j];
}else{
pos = j;
break;
}
}
if(pos + 1 > 0){
list[pos + 1] = target;
}
}
for (int i = 0; i < list.length; i++) {
System.out.println(list[i]);
}
}
插入排序的思路不需要额外的占用程序运行空间,因此空间复杂度为o(1)。但同样的,由于插入排序本质上来说可以认为是一个双循环结构。先对外层需要排序的数组结构进行遍历,同样的,对于每个循环到的元素,还需要利用该元素与该元素之前的子数组进行遍历比较。在讨论时间复杂度时,考虑到可能存在的完全倒序数组,需要对所有数据都进行移动操作,这种情况下会导致时间复杂度达到o(n^2)。但如果所有元素都是刚刚好拍排好的情况,对应的时间复杂度为o(n)。平均来说该排序算法的时间复杂度是o(n^2)。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。