码迷,mamicode.com
首页 > 其他好文 > 详细

记录我学习数据结构之路(七)

时间:2015-08-02 21:48:56      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

直接插入排序的基本操作:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

这是书上写的操作,他是把数组的第一个位置空出来,从第二个位置开始开始放入数据,那么空出来的第一个位置就是用来暂时存放取出来的数值的。从数组的第三个位置开始取,取出来之后向前遍历,如果前一个值比它大,那么前一个人往后移动一位,直到找到不比取出来的数值大的,然后就把取出来的值插入那个值后面。

我就不用数组的第一个值作存放取出值了,数组从0位开始存,另外再声明了一个变量来存放取出来的值:

public void sort(){
		int out,in;
		for(out = 1; out < nElement; out++){
			long temp = a[out];
			in = out;
			while(in > 0 && a[in-1] > temp){
				a[in] = a[in-1];
				in--;
			}
			a[in] = temp;
		}
	}

直接插入排序中只多了一个辅助变量的空间,主要是看时间时间复杂度。

当最好的情况,也就是要排序的表本身就是有序的,只是比较没有任何的移动,时间复杂度为0。当最坏的情况,即待排序表是逆序的情况,此时需要比较2+3+...+(n+2)(n-1)/2次,而记录的次数也达到了最大值(n+4)(n-1)/2次。如果排序是随机的,那么根据概率相同的原则,平均比较和移动次数约为n^2/4次。

因此,直接插入排序法的时间复杂度为O(n^2)。虽然跟冒泡法和选择排序的时间复杂度是一样的,但直接插入排序比他们俩的效率要高。


记录我学习数据结构之路(七)

标签:

原文地址:http://my.oschina.net/u/2279675/blog/486706

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!