排序之二分插入排序

二分插入排序
算法思想简单描述:通过构造二分插入函数,在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。
#include <stdio.h>   
  
void bin(int a[], int num) //构造一个binary二分插入排序//  
{   
    int i, j,  temp, left, right, mid;   
    for (i = 1; i < num; i++) {   
        temp = a[i];//将数组元素暂存到临时变量temp中//   
  
        left = 0; //区间左端点//
        right = i - 1; //区间右端点//  
        while (left <= right) {   
            mid = (left + right) / 2; //二分插入的位置//  
            if (temp > a[mid])//判断元素所在区间,如果元素的值大于数组中间位置的元素值//   
                left = mid + 1;//那么该元素在原区间的右半边,更新左端点,区间减小二分之一//   
            else  
                right = mid -1; //否则该元素在原区间的左半边,更新右端点,区间减小二分之一//  
        } 
		//每次查找完毕后,left总比right大一,a[left]总是存放第一个比num大的数,因此应从此处开始,
		//每个元素右移一位,并将num存入a[left]中,这样就保证了a[0...i]是排好序的             
       
        for (j = i - 1; j >= right; j--) //后移排序下标大于a[i]的记录//  
            a[j+1] = a[j];   
  
        a[left] = temp;   
    }   
}   
int main()   
{   
    int i, num;   
    int a[] = {9,5,6,8,7,2,1};   
    num = sizeof(a) / sizeof(int);// a中元素的个数//  
    bin(a, num);   
  
    for (i = 0; i < num; i++)   
        printf("%d ", a[i]);   
    printf("\n"); 
	return 0;
}   
输出:1 2 5 6 7 8 9
还有一种递归法实现二分查找...
#include<iostream>
using namespace std;

int a[110]  , t ;

int Bin( int left , int right )	{
	int mid = ( left + right ) / 2 ;
	if( t > a[mid] )
		Bin( mid + 1 , right ) ;
	else if( t < a[mid] )
		Bin( left , mid - 1 ) ;
	else if( t == a[mid] )
		return mid ;
}



int main()
{
	for(int i = 1 ; i <= 100 ; i++)
		a[i] = i ;
	cin >> t ;
	cout << Bin(1,100)  << endl ;
	return 0 ;
}
输入:22
输出:22
原理:输入的t值,在数组a中的位置有三张情况:大于中间位置,小于中间位置,等于中间位置.
第一种情况时,再递归调用bin()函数,第二种情况同样,第三种情况,直接返回中间位置...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值