C冒泡递归折半等算法

来源:互联网 发布:李敖 胡因梦 知乎 编辑:程序博客网 时间:2024/06/01 10:13
#include <stdio.h>#include <stdlib.h>#include <time.h>#define LENGTH 20void 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;elsereturn 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;elsereturn 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;}

0 0