于插入排序,如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的次数,我们称为二分插入排序。
算法概述
采用折半查找,来找到待排序元素的插入位置,然后移动元素,将待排序的元素插入序列中。移动必须从最后一个记录开始,向后移动一位,再移动倒数第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;
}
运行结果
当数组元素较多时,二分插入排序的比较次数比直接插入排序的最差情况好得多,但比直接插入排序的最好情况要差,所以当元素初始序列已经接近升序时,直接插入排序比二分插入排序比较次数少。二分插入排序元素移动次数与直接插入排序相同,依赖于元素的初始序列。
也就是说,相比于直接插入排序,二分插入排序只是减少了元素比较的次数,并未减少元素移动的次数,本质上讲,并未提高算法的性能。
最后
以上就是精明大象最近收集整理的关于经典排序(四)——二分插入排序的全部内容,更多相关经典排序(四)——二分插入排序内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复