二分法实现插入排序,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现

代码可在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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值