静态二分查找
来源:互联网 发布:sql select if 编辑:程序博客网 时间:2024/06/08 16:49
二分查找
//StaticBinarySearch.c#include <stdio.h>#include <stdlib.h>#include <time.h>#define SIZE 20void print_array(int a[],int len){int i = 0;for(i=0;i<len;i++){printf("%d,",a[i]);}printf("\n");}void array_sort(int a[],int len){int i = 0;int j = 0;int k = 0;int temp = 0;for(i=1;i<len;i++){k = i;temp = a[i];for(j=i-1;j>=0;j--){if(a[j] > temp){a[j+1] = a[j];k = j;}}if(k!=i){a[k] = temp;}}} int binary_search(int a[],int low,int high,int key) //二分查找 {int ret = -1;if(low<=high){int mid = (low + high)/2;if(key == a[mid]){ret = mid;}else if(key < a[mid]){ret = binary_search(a,low,mid-1,key);}else if(key > a[mid]){ret = binary_search(a,mid+1,high,key);}}return ret;}int main(int argc, char *argv[]) {int array[SIZE] = {0};int i = 0;int key = 0;int index = -1;srand((unsigned int)time(NULL));//开始随机数产生的时刻 for(i=0;i<SIZE;i++){array[i] = rand()%100; //取100以内的数 }key = rand()%100;printf("key = %d\n",key);printf("ALL:\n");print_array(array,SIZE);array_sort(array,SIZE);printf("After Sort...:\n");print_array(array,SIZE);index = binary_search(array,0,SIZE-1,key);if(index >=0){printf("Success! array[%d] = %d\n",index,key);}else{printf("Failure!\n");}return 0;}
key = 62
ALL:
42,9,59,31,62,74,10,69,62,81,52,95,4,56,98,81,23,81,58,0,
After Sort...:
0,4,9,10,23,31,42,52,56,58,59,62,62,69,74,81,81,81,95,98,
Success! array[11] = 62
Process exited normally.
Press any key to continue . . .
优点:查找次数少;
缺点:有多个相同的数字时,只能查找到一个。
二分查找改进:插值查找
//InterpolationSearch.c#include <stdio.h>#include <stdlib.h>#include <time.h>#define SIZE 20void print_array(int a[],int len){int i = 0;for(i=0;i<len;i++){printf("%d,",a[i]);}printf("\n");}void array_sort(int a[],int len){int i = 0;int j = 0;int k = 0;int temp = 0;for(i=1;i<len;i++){k = i;temp = a[i];for(j=i-1;j>=0;j--){if(a[j] > temp){a[j+1] = a[j];k = j;}}if(k!=i){a[k] = temp;}}} int interpolation_search(int a[],int low,int high,int key) //二分查找 {int ret = -1;while((low<=high)&&(a[low] <= key)&&(key <= a[high])){float fx = 1.0f *(key - a[low]) / (a[high] - a[low]);int mid = low + fx * (high - low); //int mid = (low + high)/2;if(key == a[mid]){ret = mid;break;}else if(key < a[mid]){high = mid - 1;}else if(key > a[mid]){low = mid + 1;}}return ret;}int main(int argc, char *argv[]) {int array[SIZE] = {0};int i = 0;int key = 0;int index = -1;srand((unsigned int)time(NULL));//开始随机数产生的时刻 for(i=0;i<SIZE;i++){array[i] = rand()%100; //取100以内的数 }key = rand()%100;printf("key = %d\n",key);printf("ALL:\n");print_array(array,SIZE);array_sort(array,SIZE);printf("After Sort...:\n");print_array(array,SIZE);index = interpolation_search(array,0,SIZE-1,key);if(index >=0){printf("Success! array[%d] = %d\n",index,key);}else{printf("Failure!\n");}return 0;}
缺点:引入乘法和除法,消耗时间更多;(可以用斐波那契数列进行再次改进)
1
1 0
- 二分静态查找
- 静态二分查找
- 【数据结构】静态查找之二分查找
- 静态查找方法(顺序查找与二分查找)
- 查找算法总结之顺序查找、二分查找、静态树查找
- 查找算法总结之顺序查找、二分查找、静态树查找
- 静态表查找(顺序查找,二分查找,斐波那契查找)
- 静态表查找(顺序查找,二分查找,斐波那契查找)
- 顺序查找--二分查找--静态树表的查找--分块查找
- (五)数据结构之静态查找的简单实现:顺序查找和二分查找
- 算法:静态查找表(Static Search Table)(顺序查找、二分查找、插值查找、斐波纳契查找)
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- Linux命令之dos2unix - DOS格式文本文件UNIX格式文件的转换
- JDK容器与并发—Queue—SynchronousQueue
- HTMl5的存储方式sessionStorage和localStorage详解
- java和javac的基本用法
- 病毒木马查杀实战第018篇:病毒特征码查杀之基本原理
- 静态二分查找
- Leetcode 343(Integer Break非动态规划求解)
- C++ STL stack queue 的使用函数
- 科大讯飞语音识别
- WPF中Frame和WebBrowser关系
- 应用eclipse自带工具进行代码调用函数分析
- AsyncTask和Handler对比
- J2SE再学习总结
- Android开发-API指南-<manifest>