插入排序:2路插入排序原理分析及源码演示
来源:互联网 发布:caffe教程 编辑:程序博客网 时间:2024/06/15 04:37
原理
2路插入排序是在直接插入排序的基础上进行优化:减少排序过程中元素移动的次数。不过需要额外增加n个辅助空间。
关键思路
把新增的辅助空间(n个元素的数组),当做一个环对待,再第一个元素插入之后(标记当前最大最小元素),以后分别从两边插入数据,比最大元素大的放右边,比最大元素小的放左边。
如果大于最小,小于最大,则按照常规插入排序的思路,把最大的元素依次往右边移动,直到找到合适的位置。
源码
template <class T>//2_insert_sortint sort(T* t, int n){ int comp_times = 0; T *tmp = new T[n]; tmp[0] = t[0]; int big = 0, small = 0; for(int i=1; i<n; i++) { T current = t[i]; if(current >= tmp[big]) { big = (big + 1 + n) % n; tmp[big] = current; comp_times++; } else if(current <= tmp[small]) { small = (small - 1 + n) % n; tmp[small] = current; comp_times++; } else { int p = (big + 1 + n) % n; while(tmp[(p - 1 + n) % n] > current) { tmp[(p + n) % n] = tmp[(p - 1 + n) % n]; p = (p - 1 + n) % n; comp_times++; } tmp[(p + n) % n] = current; big = (big + 1 + n) % n; } } for(int k=0; k<n; k++) { t[k] = tmp[(small + k) % n]; } delete[] tmp; return comp_times;}
运行结果:
时间复杂度
最好情况下:
如:已经有序的情况
9 7 5 3 2 1
或者:(不会遇到比最大元素小比最小元素大的情况)
8 7 6 5 9 4 3
空间复杂度
由于借助了辅助空间,空间复杂度为:
0 0
- 插入排序:2路插入排序原理分析及源码演示
- 插入排序之shell排序分析及源码演示
- 插入排序原理分析及Java实现
- java插入排序演示
- 插入法排序及原理
- 插入排序分析及优化
- 插入排序及算法分析
- 插入排序(直接插入排序法)原理及代码
- 插入排序,选择排序,归并排序等等源码及简要分析
- 插入排序--2路插入排序
- 插入排序之2路插入排序
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 浅析各类排序算法(四) 插入类排序之直接插入排序及折半插入,2-路插入算法
- 冒泡排序、插入排序、选择排序的原理及比较
- 排序算法(冒泡、选择、插入)附Java演示源码
- 插入-排序原理及Java 实现
- //插入排序 直接插入排序 二分插入排序 2-路插入排序 表插入排序 希尔排序
- PX4 如何切换到offboard 模式
- TCP三次握手和四次挥手的理解
- 把排序数组转换为高度最小的二叉搜索树
- SQLite实现数据持久化存储 购买商品
- SQLite数据库
- 插入排序:2路插入排序原理分析及源码演示
- O(n^2)排序算法1——冒泡排序,改进冒泡排序,java实现
- 获取完数
- 三十三、SpringBoot配置属性之MVC
- 用VS2008编写汇编程序
- 一个整数反转的最短代码
- MATLAB读取数据库中的数据
- Android SQLite实现数据持久化存储购买商品小案例
- Cookie/Session机制详解