您的位置:首页 > 其它

C冒泡递归折半等算法

2015-03-31 13:54 399 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息