InsertionSort

算法思路及原理
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程。
算法分析
时间复杂度
当元素初始状态为正序时,只需要当前元素与前一元素作比较就可以结束排序,一共需要比较n-1次,O(n);
当元素初始状态为逆序时,需要比较并交换每一次的相邻元素,O(n^2);
故平均时间复杂度为o(n^2)。
空间复杂度
不需要额外空间,O(1)。
稳定性
插入排序就是把后一个元素往前调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以插入排序是一种稳定排序算法。
适用性
样本小且基本有序的时候效率很高
实现代码
1 | public class InsertionSort { |
算法优化
不使用swap方法,设置一个temp变量来存储需要排序的元素,如果temp比前一个元素小,就直接
arr[j] = arr[j-1]
,依次向前比较,直到temp比前一个元素大,就让对应位置的值为temp。
1 | public class InsertionSort2 { |
- 本文标题:InsertionSort
- 本文作者:Kang
- 创建时间:2021-03-09 16:46:23
- 本文链接:ykhou.github.io2021/03/09/InsertionSort/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!