七种排序--------直接插入排序(Straight Insertion Sort)

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

代码如下:

void InsertSort(SqList *L)
{
	int i,j,k;
	for(i = 2;i <= L->length;i++)
	{
		if(L->r[i] < L->r[i - 1])      //需将L->r[i]插入有序子表
		{
			L->r[0] = L->r[i];         //设置哨兵
		    for(j = i - 1;L->r[j] > L->r[0];j--)
		        L->r[j+1] = L->r[j];      //记录后移
		    L->r[j + 1] = L->r[0];     //插入到正确位置
		}
	}
}

1.程序开始运行,此时我们传入的Sqlist 参数的值为length = 6,r[6] = {0,5,3,4,6,2},其中,r[0] = 0在后面将起到哨兵的作用,

2.第4~13行就是排序的主循环。i从2开始的意思是我们假设r[1] = 5已经放好位置,后面的牌其实就是插入到他的左侧还是右侧的问题。

3.第6行,此时 i = 2,L.r[i] = 3比L.r[i - 1] = 5 要小,因此执行第8~11行的操作。第8行,我们将L.r[0] 赋值为L.r[i] = 3的目的是为了起到第9~11行的循环终止的判断依据。

4.此时,第10行就是在移动完成后空出了空位,然后第11行L.r[j + 1] = L.r[0],将哨兵的3赋值给j = 0时的L.r[j + 1]。

5.继续像上面那样循环,循环结束排序也就完成了。

排序复杂度:

如果排序记录是随机的,那么根据概率相同的原则,平均比较和移动次数约为n*n/4次。因此,直接插入排序法的时间复杂度为O(n*n).虽然时间复杂度相同,但插入排序法比冒泡排序和简单选择排序的性能要好一点。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章