折半插入排序算法
Posted 路之编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了折半插入排序算法相关的知识,希望对你有一定的参考价值。
01.算法的基本思路
由于插入排序实在一个有序表中进行查找和插入,因此这个“查找”可以采用折半查找方法,由此进行的插入排序称为折半插入排序。
那么问题来了。什么是折半查找呢?
折半查找的思路:设当前区间为R[low...high],首先确定该区间的中点位置mid=⌊(high+low)/2⌋;然后将待查的k值与R[mid].key比较,若相等,则查找成功并返回该位置,否则需确定新的查找区间;若R[mid].key>k,则由表的有序性可知R[mid...n-1].key均大于k,因此若表中存在关键字等于k的记录,必定是在位置mid左边的子表R[0...mid-1]中,故新的查找区间为R[0...mid-1];类似地,若R[mid].key<k,要查的k必在mid的右子表R[mid+1...n-1]中,即新的查找区间为R[mid+1...n-1]。
02.算法的实现
/*折半查找短发的代码*/
int BinSearch(SeqList R,int n,KeyType k)
{
int low=0,high=n-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(R[mid].key==k) //查找成功返回
return mid;
if(R[mid].key>k) //继续在R[low...mid-1]中查找
high=mid-1;
else //继续在R[mid+1...high]中查找
low=mid+1;
}
return -1;
}
/*折半插入的代码算法*/
void InsertSort(SqList R[],int n)
{
int i,j,low,high,mid;
SqList tmp;
for(i=1;i<n;i++)
{
tmp=R[i];
low=0;high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(tmp.key<R[mid].key)
high=mid-1;
if(tmp.key>R[mid].key)
low=mid+1;
}
for(j=i-1;j>=high+1;j--) //元素后移
R[j+1]=R[j];
R[high+1]=tmp;
}
}
03.排序方法的演示
04.折半插入排序例题
END
往期推荐
以上是关于折半插入排序算法的主要内容,如果未能解决你的问题,请参考以下文章