/******************************************************************** 循环查找,二分法查找,分块查找 (二叉查找树(二叉排序树),哈希表查找以后碰到时在做笔记) ********************************************************************/ //顺序查找 #include <stdio.h> int sequeceSearch(int* range,int length, int key) { for(int i=0; i<length; i++) { if(range[i] == key) return i; //查找成功 } return -1;//查找失败 } //二分法递归查找 int binaryFind(int* range,int left,int right, int key); int binarySearch(int* range,int length, int key) { if (range == NULL || length == 0) return -1; int left = 0; int right = length - 1; return binaryFind(range,left,right,key); } int binaryFind(int* range,int left,int right, int key) { if(left>right) return -1; int mid = (left + right)/2; if(range[mid] == key) return mid; else if(range[mid] <key) { return binaryFind(range,mid+1,right,key); } else { return binaryFind(range,left,mid-1,key); } } /* //二分法非递归查找 int binarySearch(int* range, int length, int key) { if (range == NULL || length == 0) return -1; int left = 0; int right = length -1; int mid = (left + right)/2; while(right >= left ) { if(range[mid] == key) return mid; else if(range[mid] <= key) left = mid + 1; else right = mid - 1; mid = (left+right)/2; } return -1; } */ /* //分块查找 将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序, 但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块 中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素... step1 先选取各块中的最大关键字构成一个索引表; step2 查找分两个部分:先对索引表进行二分查找或 顺序查找,以确定待查记录在哪一块中; 然后,在已确定的块中用顺序法进行查找。 #include <stdio.h> struct index //定义块的结构 { int key; int start; int end; } index_table[4]; //定义结构体数组 int block_search(int key, int a[]) //自定义实现分块查找 { int i, j; i = 1; while (i <= 3 && key > index_table[i].key) //确定在那个块中 i++; if (i > 3) //大于分得的块数,则返回0 return 0; j = index_table[i].start; //j等于块范围的起始值 while (j <= index_table[i].end && a[j] != key) //在确定的块内进行查找 j++; if (j > index_table[i].end) //如果大于块范围的结束值,则说明没有要查找的数,j置0 j = 0; return j; } */ //单元测试 void test() { int arr[9] = {1,2,3,4,5,6,7,8,9}; int k = binarySearch(arr,9,1); printf("%d\t",k); k = binarySearch(arr,9,9); printf("%d\t",k); k = binarySearch(arr,9,7); printf("%d\t",k); } int main() { test(); return 0; }
三类基本查找算法(循环,二分,分块),布布扣,bubuko.com
原文:http://blog.csdn.net/walkerkalr/article/details/20390559