直接插入排序
2017-12-07 22:07
232 查看
从第一个元素开始,被认为是一个有序的序列,剩下的元素按位置顺序逐一与前面的有序序列进行比对并按序插入到序列中。这样序列首部从小大到序列在增长,序列尾部无序的部分在削减,直到最尾部一个元素比对结束后,整个序列变成有序。
Java代码实现:
每个元素在与前面有序部分进行比对的次数是由数据决定的。例如[2,3,5][6,…..],6从右到左进行比对只需要比对1次,5<6就可以决定自己的位置;[2,3,5][1,…..],1需要比对3次,1<2<3<5。
我们用数学中经常使用的极限法来推演下,假设一个已经正序排列的列表[1,2,3,4,…n],我们对它做正序的直接插入排序,需要比较n-1次,如果对他做倒序的直接插入排序,需要比较1+2+3+(n/2)…+n-1=n^2次。所以它是个时间不确定的算法,时间复杂度O(n^2)
从稳定性来考虑,对相等值的顺序如何处理是可以控制的,b原来在a的右边我们在排序的时候可以让后来的相等值b排在先来的相等值a后面。你可能会讲:我就偏排在前面你能咋地!对不起,那是你自己的事情了,一个明明可以保持稳定性的算法为什么要去打破呢。
运算中都是通过位移来解决没有带来额外的开销,所以空间复杂度很低,O(1),可以不考虑。
Java代码实现:
public class DirectInsert extends BaseSort{ public static long COUNT;//计数 //直接插入排序,从小到大排序 public static Integer[] sort(Integer[] list){ for(int i=0;i<list.length;i++) { int x=list[i];//要去与已有序列比较的值x变量 for(int n=i-1; n>=0 ;n--) { COUNT++; //与前面i-1个值进行比较 if(x<list ) { list[n+1] = list ;//往后挪一位置 list = x;//x替换该位置 }else { //x已经比尾巴最末端的大了,剩下的就不需要比较了 break; } } } return list; } }测试结果:
[179,-50,-27,155,120,-122,-33,-96,-168,-82,156,79,106,-187,190,104,143,11,170,142] Sorting.............. [-187,-168,-122,-96,-82,-50,-33,-27,11,79,104,106,120,142,143,155,156,170,179,190] 比对次数:98
每个元素在与前面有序部分进行比对的次数是由数据决定的。例如[2,3,5][6,…..],6从右到左进行比对只需要比对1次,5<6就可以决定自己的位置;[2,3,5][1,…..],1需要比对3次,1<2<3<5。
我们用数学中经常使用的极限法来推演下,假设一个已经正序排列的列表[1,2,3,4,…n],我们对它做正序的直接插入排序,需要比较n-1次,如果对他做倒序的直接插入排序,需要比较1+2+3+(n/2)…+n-1=n^2次。所以它是个时间不确定的算法,时间复杂度O(n^2)
从稳定性来考虑,对相等值的顺序如何处理是可以控制的,b原来在a的右边我们在排序的时候可以让后来的相等值b排在先来的相等值a后面。你可能会讲:我就偏排在前面你能咋地!对不起,那是你自己的事情了,一个明明可以保持稳定性的算法为什么要去打破呢。
运算中都是通过位移来解决没有带来额外的开销,所以空间复杂度很低,O(1),可以不考虑。
相关文章推荐
- 插入排序------直接插入排序
- 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现
- 插入排序(直接插入排序法)原理及代码
- 数据结构之直接插入排序
- 直接插入排序
- Java实现直接插入排序和折半插入排序算法示例
- 直接插入排序(Straight Insertion Sort)
- C++代码,数据结构-内部排序-插入排序-直接插入排序
- 第15周项目1-验证算法(2)直接插入排序
- 第15周项目1-(2)直接插入排序
- Java实现直接插入排序
- 第15周项目1 -2验证算法之直接插入排序
- 【排序算法】直接插入排序(java实现)
- 直接插入排序
- 用链表实现直接选择排序和直接插入排序
- 数据结构——直接插入排序(c++)
- 直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序
- 直接插入排序
- 八大排序算法总结之一(冒泡排序,快速排序,直接插入排序,希尔排序)
- 插入排序之直接插入排序