今天我们不刷力扣了,我们来复习(手撕)一下数据结构中的八大排序算法之一,冒泡排序
基本概念:
英文名:Straight Insertion Sort
也是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表
代码:
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {5,4,3,2,1,-1,-5,-3};
System.out.println("未排序数组:"+ Arrays.toString(arr));
insertSort(arr);
System.out.println("未排序数组:"+ Arrays.toString(arr));
}
public static void insertSort(int[] arr){
//插入排序从第二个元素开始进行,
// 所以这里i(作为索引)设为1,循环次数为arr.length-1;
for (int i=1;i<arr.length;i++){
int insertIndex = i;
int insertValue = arr[i];
//当要排序的元素比前一个元素小时,进入循环
while (insertIndex > 0 && insertValue < arr[insertIndex-1]){
//每次arr[i]<arr[i-1],就把arr[i-1]的值往后移,直到arr[i]>arr[i-1]
arr[insertIndex] = arr[insertIndex-1];
insertIndex--;
}
arr[insertIndex] = insertValue;
//insertValue 在比较过程中一直没变,
//最后一步将insertValue的值赋给insertIndex所指的元素
}
}
}
核心思路:
第一层循环是遍历整个数组,创建临时变量存储对应的数组下标与值
第二层循环当前数组元素值大于前一个元素值的时候,将两个元素互换
最后 insertvalue相当于临时保存值,等前面排好序后就可以插入对应的位置
算法特点:
- 从以上过程可得,这个算法是遍历一次所有数,分别插入,但第一个数一定有序,不用排,因此n个数需要n-1次遍历
- 即i直接从1开始
- 每一次插入的比较都是从前一个数开始,所以我们可以直接将第二个循环的参数j设为i-1
- 每一次插入我们首先拿出要插入的数
- 然后比较,如果大于取出数,就将这个数后移,j-1
1.时间复杂度
最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O ( n ) O(n)O(n)
最坏情况全部反序,内层每次遍历已排序部分,最坏时间复杂度为O ( n 2 ) O(n^2)O(n2)综上,因此直接插入排序的平均时间复杂度为O ( n 2 ) O(n^2)O(n 2 )
2.空间复杂度
辅助空间是常量
平均的空间复杂度为:O ( 1 ) O(1)O(1)3.算法稳定性
相同元素的前后顺序是否改变插入到比它大的数前面,所以直接插入排序是稳定的
参考资料:
插入排序(常见经典排序算法)_插入排序算法的伪码从第二位开始,依次与前位选择插入位置-CSDN博客