二分插入算法是在已经排序好的序列里插入一个元素,是稳定的算法,关键词是折中。

比如说我要在12345678910里插入一个3,那么我先看看中间的数比3大,还是比3小,要是比3大,我就去后一半,如果是比3小,我就去前一半,现在进入某个一半后,再做如此操作,最后将其他的元素依次往后挪一位就可以了。

二分插入算法是没有排序功能的,只有插入功能。

/***************************************************
##filename : binaryinsert.c
##author : GYZ
##create time : 2018-10-31 09:54:39
##last modified : 2018-11-02 12:18:44
##description : NA
***************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

void binaryInsert(int a[],int n)
{
/*1,binary insert sort*/
int left,middle,right;
int i,temp;

left = 0;
right = n-2;
temp = a[n-1];
middle = (left + right)/2;
while((middle >left) && (middle < right))
{
if(a[middle] == temp)
{
break;
}
else if (a[middle] > temp)
{
right = middle;
}
else
{
left = middle;
}
middle = (left + right)/2;
}
/*2,move others to right*/
for(i = n-1; i > middle+1; i--)
{
a[i] = a[i-1];
}
a[middle+1] = temp;
/*straight insertion sort*/

/* int temp = 0;
int i = 0,j = 0;

for(i = 1; i < n; ++i)
{
temp = a[i];
for(j = i-1; j >= 0; --j)
{
if(temp < a[j])
{
a[j+1] = a[j];
a[j] = temp;
}
else
{
break;
}
}
}*/
}
void printArr(int a[],int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%d,",a[i]);
}
printf("\n");

}
int main(int argc,char *argv[])
{
int length = 0;
int begin,end;

int a[] = {1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,
18,19,20,21,22,23,24,
25,26,27,28,29,30,31,32,14};

length = sizeof(a) / sizeof(a[0]);
begin = clock();
binaryInsert(a,length);
end = clock();
printf("%d\n",end-begin);
printArr(a,length);

return 0;
}