经典排序(四)——二分插入排序

于插入排序,如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的次数,我们称为二分插入排序。

 

算法概述

采用折半查找,来找到待排序元素的插入位置,然后移动元素,将待排序的元素插入序列中。移动必须从最后一个记录开始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位。

 

C语言实现

#include<stdio.h>

void BinInsertSort(int A[],int n)
{
	int i,j;

	for(i = 1;i < n;i++)
	{
		int get = A[i];//取得的待排新元素
		int left = 0;
		int right = i-1;//已排序的有序区间
		
		while(left <= right)//有序区间内进行折半查找,找到插入位置
		{
			int mid = (right+left)/2;
			if(A[mid] > get)
				right = mid - 1;
			else
				left = mid + 1;
		}
		for(j = i - 1;j >= left;j--)//移出位置
		{
			A[j+1] = A[j];
		}
		A[left] = get;//将待排元素插入
	}
}

int main()
{
	int i;
	int A[] = {5,3,56,23,12,67,25};
	int n = sizeof(A)/sizeof(A[0]);

	BinInsertSort(A,n);

	for(i = 0;i < n;i++)
	{
		printf("%-6d",A[i]);
	}
	printf("\n");
	return;
}

 

运行结果

当数组元素较多时,二分插入排序的比较次数比直接插入排序的最差情况好得多,但比直接插入排序的最好情况要差,所以当元素初始序列已经接近升序时,直接插入排序比二分插入排序比较次数少。二分插入排序元素移动次数与直接插入排序相同,依赖于元素的初始序列。

也就是说,相比于直接插入排序,二分插入排序只是减少了元素比较的次数,并未减少元素移动的次数,本质上讲,并未提高算法的性能。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值