代码可在anycodes在线编译测试
递归实现:
#include <stdio.h>
int binarySearch(int* a, int fI, int lI, int N)
{
int mI = (fI+lI) >> 1;
if (N > *(a+mI))
{
fI = mI + 1;
if(fI > lI)
return mI+1;
binarySearch(a, fI, lI, N);
}
else if (N < *(a+mI))
{
lI = mI - 1;
if(fI > lI)
return mI;
binarySearch(a, fI, lI, N);
}
else
return mI+1;
}
void insertSort(int* a, int index, int N)
{
int key = *(a+index);
if(index+1 <= N)
{
int i = binarySearch(a, 0, index-1, key);
int j = index-1;
for (;j>=i;j--)
{
*(a+j+1) = *(a+j);
}
*(a+i) = key;
insertSort(a, index+1, N);
}
return;
}
int main()
{
int a[10] = {212,343,534,2,3,67,34,78,90,32};
int L = sizeof(a)/sizeof(int);
int i = 0;
insertSort(a, 1, L);
for (;i<L;i++)
printf("%d ",*(a+i));
printf("\n");
return 0;
}
非递归实现:
#include <stdbool.h>
#include <stdio.h>
void insertSort(int* a, int L)
{
int i = 0,j = 0;
int fI = 0, lI = 0, mI = 0,key = 0, index = 0;
for(i=1;i<L;i++)
{
fI = 0;
lI = i-1;
key = *(a+i);
while(true)
{
mI = (fI+lI) >> 1;
if(key > *(a+mI))
{
fI = mI + 1;
if(fI > lI)
{
index = mI + 1; break;
}
}
else if(key < *(a+mI))
{
lI = mI - 1;
if(fI > lI)
{
index = mI; break;
}
}
else
{
index = mI; break;
}
}
for(j=i-1;j>=index;j--)
*(a+j+1) = *(a+j);
if(i-1 >= index)
*(a+j+1) = key;
}
}
int main()
{
int a[10] = {12323,3435,65,22,7897,34,4234,546,2,435};
int i = 0;
int L = sizeof(a) / sizeof(int);
insertSort(a, L);
for(i=0;i<L;i++)
printf("%d ", *(a+i));
printf("\n");
return 0;
}
#include <iostream>
using namespace std;
void binSort(int *a, int len);
int binSearch(int *a, int len, int k);
int main(int argc, char** argv)
{
int a[10];
int len = 0;
while (cin >> a[len])
{
len++;
if (len == 10)
break;
}
binSort(a, len);
for (int i=0;i<len;++i)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
void binSort(int *a, int len)
{
int index = 0;
int tmp = 0;
for (int i=1;i<len;++i)
{
index = binSearch(a, i, *(a+i));
tmp = *(a+i);
for (int j = i;j>index;--j)
*(a+j) = *(a+j-1);
*(a+index) = tmp;
}
}
int binSearch(int *a, int len, int k)
{
int l = 0, r = len-1;
int m;
while (l <= r)
{
m = (l+r) >> 1;
if (a[m] < k && a[m+1] >= k)
return m+1;
else if (a[m] < k)
l = m+1;
else
r = m-1;
}
return l;
}