您的位置:首页 > 其它

直接插入排序

2017-12-07 22:07 232 查看
从第一个元素开始,被认为是一个有序的序列,剩下的元素按位置顺序逐一与前面的有序序列进行比对并按序插入到序列中。这样序列首部从小大到序列在增长,序列尾部无序的部分在削减,直到最尾部一个元素比对结束后,整个序列变成有序。



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),可以不考虑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  插入排序 算法