数据结构与算法学习之路:二分插入排序

一、什么是二分插入排序?

设在数据表中有一个元素序列v[0],v[1],v[2]......v[n].其中v[0],v[1],v[2]......v[i-1]是已经排好序的元素。在插入v[i]。利用折半搜索寻找v[i]的插入位置。同时,二分插入排序是一种稳定的排序。当n较大时,总排序码比较次数比直接插入排序的最差情况好得多,但比最好情况要差,所元素初始序列已经按排序码接近有序时,直接插入排序比二分插入排序比较次数少。二分插入排序元素移动次数与直接插入排序相同,依赖于元素初始序列。

事实上,我们可以将二分插入排序理解为直接插入排序的一种改进,利用二分的思想减少了对比的次数。

时间复杂度:虽然二分插入排序中,找到插入的位置的平均时间是O(nlogn),但是移动元素仍需要O(n^2)的时间。所以总的来说,二分插入排序的时间复杂度仍然是O(n^2)。


二、算法思想:

利用二分查找找出位置,然后插入。


三、代码实现:

<span style="font-size:12px;">void BinaryInsert_Sort(int* nums, int length){
	int low, high, middle;
	for (int i = 2; i < length; ++i){
		low = 1;
		high = i - 1;

		nums[0] = nums[i];
		while (low <= high){
			middle = (high + low) / 2;

			if (nums[middle]>=nums[0])
				high = middle - 1;
			else
				low = middle + 1;
		}

		for (int j = i; j > low; --j)
			nums[j] = nums[j - 1];
		nums[low] = nums[0];
	}</span>



你可能感兴趣的:(数据结构与算法学习之路:二分插入排序)