直接插入排序的基本操作:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增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)。虽然跟冒泡法和选择排序的时间复杂度是一样的,但直接插入排序比他们俩的效率要高。
时间: 2024-10-11 16:18:02