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; }
相关文章推荐
- 【PyQt】算法-插入、递归、冒泡
- 算法之冒泡、选择、递归、随机、循环
- 算法复习1(冒泡、快排、折半)
- python 中的一些基础算法:递归/冒泡/选择/插入
- 【4.1】算法递归 冒泡,选择插入排序
- 【算法导论】02——渐近符号、递归及解法
- C语言经典算法(七)——递归实现阶乘算法的两种方法
- 算法设计与分析 快速排序的递归实现算法
- 【算法-分治】从数组中取出n个元素的所有组合(需要深入理解递归)
- 冒泡算法 C、C++
- 算法学习之递归--汉诺塔问题
- 算法训练 区间k大数查询(数组复制、排序算法、递归查找)
- 算法 -- Java实现二分(折半)查找(图解 + 代码实现)
- 三种基本的排序算法:选择,插入,冒泡
- 漫谈二叉树之递归遍历算法(两种不同的思路)
- 数据结构与算法 -- 二叉树链式详解((非)/递归遍历,叶子个数,深度计算)
- 非递归全排列算法 c++
- [原创] 算法之递归(2)- 链表遍历
- 递归与非递归实现走迷宫算法
- 经典递归算法之排列,组合,集合和换零钱, Python yield实现.