第二章之“二分查找”(迭代实现,练习2.3-5)
2011-12-26 22:04
190 查看
#include <stdio.h> #include <string.h> #include <time.h> #define BUFFER_SIZE 10 void Merge(int *a,int p,int q,int r) { int n1=q-p+1; int n2=r-q; int b[n1]; int c[n2]; int n=n1+n2; int i=0; int j=0; int k=0; memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); for(i=0;i<n1;i++) { b[i]=a[i+p]; } for(i=0;i<n2;i++) { c[i]=a[i+q+1]; } for(i=p,j=0,k=0;i<=r&&j<n1&&k<n2;i++) {//注意i的初始值和结束值 if(b[j]<=c[k]) { a[i]=b[j]; j++; } else { a[i]=c[k]; k++; } } if(j<n1) { for(;i<=r&&j<n1;i++) { a[i]=b[j]; j++; } } else if(k<n2) { for(;i<=r&&k<n2;i++) { a[i]=c[k]; k++; } } } void MergeSort(int *a,int p,int r) { int q=0; if(p>=r) { return; } q=(p+r)/2; MergeSort(a,p,q); MergeSort(a,q+1,r); Merge(a,p,q,r); } void Output(int *a,int len) { int i=0; for(i=0;i<len;i++) { printf("%d ",a[i]); } printf("\n"); } int BinarySearch(int *a,int len,int v) { int mid=0; int p=0; int r=len-1; while(p<=r) { mid=(p+r)/2; if(v==a[mid]) { return mid; } else if(v<a[mid]) { r=mid-1; } else { p=mid+1; } } return -1; } int main() { int i=0; int v=0; int index=-1; int a[BUFFER_SIZE]; memset(a,0,sizeof(a)); srand((unsigned)time(NULL)); for(i=0;i<BUFFER_SIZE;i++) { a[i]=rand()%BUFFER_SIZE; } printf("随机生成的数组:"); Output(a,BUFFER_SIZE); //用合并排序使数组元素从小到大排序 MergeSort(a,0,BUFFER_SIZE-1); printf("从小到大排序后的数组:"); Output(a,BUFFER_SIZE); v=rand()%(BUFFER_SIZE+5); printf("随机生成待查找元素v=%d\n",v); //若存在返回查找到的第一个等于v的元素所在数组中的索引 index=BinarySearch(a,BUFFER_SIZE,v); if(index!=-1) { printf("查找到的第一个等于%d的元素所在数组中的索引为:%d\n",v,index); } else { printf("v=%d不在数组中\n",v); } system("pause"); }
相关文章推荐
- 第二章之“二分查找”(递归实现,练习2.3-5)
- java实现二分查找(迭代)
- 关于于渊的一个操作系统的实现第二版学习之第二章bochs裸机启动的练习
- 【Java数据结构】2.3双向链表的迭代实现
- 二分法实现插入排序,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现
- 判断序列中是否存在两个元素之和为x,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现
- 算法导论2.3-5答案 分别采用递归与非递归方式实现二分查找 c++实现
- 算法导论第二版习题试解-第二章练习2.3
- 第二章之“合并排序”(不使用哨兵元素,练习2.3-2)
- 二分查找(折半搜索)的迭代实现
- 第二章之“CheckSums”(练习2.3-7)
- 递归实现插入排序,算法导论练习2.3,linux C实现
- java实现二分查找(迭代与递归)
- 学习练习--IOS雪花飘落的实现方法
- 高级编程技术作业第一周2 第二章课后练习
- Go语言练习 TCPserver 与 TCPclient实现
- Matlab实现——严格对角占优三对角方程组求解(高斯赛尔德Gauss-Seidel迭代、超松弛)
- CLRS 2.3 c++实现
- Linux学习篇第二章之~练习 swap 脚本命令
- Deep learning:三十五(用NN实现数据降维练习)