静态二分查找

来源:互联网 发布: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
原创粉丝点击