概述
二分插入排序
算法思想简单描述:通过构造二分插入函数,在插入第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()函数,第二种情况同样,第三种情况,直接返回中间位置...
最后
以上就是默默煎蛋为你收集整理的排序之二分插入排序的全部内容,希望文章能够帮你解决排序之二分插入排序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复