插入排序算法之折半插入排序算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_22830285/article/details/80002043

之前有学过二分查找,其实折半插入跟二分查找都是同一个原理。在百度百科开了折半排序算法的原理后,自己试着根据原理写出了版本一的算法,版本二是参照巨人的实现思想,版本二才是重点。版本一可以忽略不看。

算法同样的目的是寻找正确的插入点。

版本一:

实现思想:

第一步:获取折半后的下标

第二步:判断插入值是否小于折半处的值,如果小于,而且 小于折半处前一个值 ,则往左再次折半(为什么要小于折半处减一的值,举个列子,原有排序 1,3,5,8  需要插入的值是4,正确的插入位置是3和5之间,第一次折半点的值为5,当4小于5,大于3时就不需要再折半了。)

第三步:当大于折半值的情况,向右再次折半。

第四步:当且仅当插入值大于折半值并且小等于于折半后一个的时候,插入点为折半点+1

重复第二第三步 直至找到插入点

//折半插入排序
public static void zbcrpx(){
int[] a={1,8,3,4,5,6,733,10};
//从开始所有遍历
for(int i=1;i<a.length;i++){
//要插入的值
int temp=a[i];
//获取折半点
int j=(i+1)/2;
//当小于折半点并且小于折半-1,折半点大于零的时候
while(temp<a[j]&&j>0&&temp<a[j-1]){
//向左再次折半 
j=j/2;
}
//当大于折半点并大于折半点+1时
while(temp>a[j]&&temp>a[j+1]){
//向右再次折半
j=(j+i)/2;
}
//仅当大于折半,且小于等于折半时,插入点为j
if(temp>a[j]&&temp<=a[j+1]){
j=j+1;
}
//得到了应该插入的位置之后,将数组后移
for(int k=i;k>j;k--){
a[k]=a[k-1];
}
a[j]=temp;
}
for(int j=0;j<a.length;j++){
System.out.print(a[j]+",");
}
}

版本二:

//折半插入排序
public static void zbcrpx2(){
int[] a={1,8,3,4,5,6,733,10};
//从一开始遍历
for(int i=1;i<a.length;i++){
//拿出要对比的数据值
int temp=a[i];
//最小对比值下标
int mins=0;
//最大对比值下标  
int maxs=i-1;
//控制循环条件
while(mins<maxs){
//设置折半点
int mid=(mins+maxs)/2;
//如果小于折半点,则对比左区间
if(temp<a[mid]){
maxs=mid-1;
}else{
//否则 对比 右区间
mins=mid+1;
}
}
//mins为插入点
for(int j=i;j>mins;j--){
//往后移
a[j]=a[j-1];
}
//最后将对比数置于mins处
a[mins]=temp;

}

for(int j=0;j<a.length;j++){
System.out.print(a[j]+",");
}
}

猜你喜欢

转载自blog.csdn.net/qq_22830285/article/details/80002043