C冒泡递归折半等算法

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LENGTH 20
void init_groupdata(int *p,int n)
{
	int i;
	srand(time(NULL));//设置随机种子
	for (i = 1; i <= n; i++)
	{
		*p=rand()%100;//得到100以内的随机数
		p++;
	}
}
void show_groupdata(const int *p,int n)
{
	int i;
	for (i = 1; i <= n; i++)
	{
		printf("%d\t",*p);
		p++;
	}
	putchar('\n');
}
//交换两个数
void swap(int *const data,int *const des)
{
	int tmp;
	tmp=*data;
	*data=*des;
	*des=tmp;
}
/**冒泡升序和降序**/
/**循环比较相邻的两个数字,比如5个数,需要比较 4+3+2+1=10次 **/
void bubble_asc(int *p,int n)
{
	int i,j,*tmp=p;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n-i; j++)
		{
			if (*tmp>*(tmp+1))
			{
				swap(tmp,tmp+1);
			}
			tmp++;
		}
		tmp=p;
	}
}
void bubble_desc(int *p,int n)
{
	int i,j,*tmp=p;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n-i; j++)
		{
			if (*tmp<*(tmp+1))
			{
				swap(tmp,tmp+1);
			}
			tmp++;
		}
		tmp=p;
	}
}
/**冒泡升序和降序**/

/**穷举法查找**/
int find_exhaustivity(const int *p,int n,int finddata)
{
	int i;
	for (i = 1; i <= n; i++)
	{
		if (*p==finddata)
		{
			return i;
		}
		p++;
	}
	return 0;
}
/**穷举法查找**/

/**二叉树查找**/
int find_tree_recursive(const int *p,int start,int end,int finddata)
{
	int mid,data;
	if (start>end)
	{
		return 0;
	}
	mid=(start+end)/2;//获得折半中间的那个数
	data=*(p+mid);
	printf("折半后的数是:%d\n",data);
	if (*(p+mid)>finddata)
		end=mid-1;
	else if (*(p+mid)<finddata)
		start=mid+1;
	else
		return mid+1;
	return find_tree_recursive(p,start,end,finddata);
}
int find_tree_cycle(const int *p,int start,int end,int finddata)
{
	int mid,data;
	while (start<=end)
	{
		mid=(start+end)/2;//获得折半中间的那个数
		data=*(p+mid);
		printf("折半后的数是:%d\n",data);
		if (*(p+mid)>finddata)
			end=mid-1;
		else if (*(p+mid)<finddata)
			start=mid+1;
		else
			return mid+1;
	}
	return 0;
}
/**二叉树查找**/
int main(void)
{
	/* 测试冒泡的升序和降序
	int data[LENGTH];
	init_groupdata(data,LENGTH);
	show_groupdata(data,LENGTH);
	bubble_asc(data,LENGTH);
	show_groupdata(data,LENGTH);
	bubble_desc(data,LENGTH);
	show_groupdata(data,LENGTH);
	*/

	int data[LENGTH],finddata,result;
	init_groupdata(data,LENGTH);
	printf("原始数据%d个:\n",LENGTH);
	show_groupdata(data,LENGTH);
	printf("请输入你需要查找的数:");
	scanf("%d",&finddata);

	/* 穷举法查找测试
	result=find_exhaustivity(data,LENGTH,finddata);
	*/

	/*折半查找测试*/
	printf("升序后的数据:\n");
	bubble_asc(data,LENGTH);
	show_groupdata(data,LENGTH);
	result=find_tree_cycle(data,0,LENGTH-1,finddata);


	result?printf("你需要查找的数 %d 在这组数据中的第 %d个\n",finddata,result):printf("没有找到需要查找的数\n");
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值