标签:二分查找 线性查找 斐波那契查找 插值查找 静态查找表
查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。//无序表,顺序查找 int line_Search(int * array,int len,int key){ for (int i = 0; i < len; i++){ if (array[i] == key){ return i; } } return -1; }线性 查找 ,可以 在 第一个位置 ,或者 最后一个位置 放一个 “哨兵”,其值等于 key。这样 可以防止 查找出界,并且效率提高很多。
int Sequential_Search2(int *a, int n, int key) { int i; a[0] = key; for(i = n; a[i] != a[0]; i--); return i; }
//二分查找,查找之前需要排序 int search_Bin(int * array,int len,int key){ int low = 0; int high = len -1; while (low <= high){ int mid = (low + high) /2 ; if (array[mid] == key){ return mid; } else if( array[mid] > key){ high = mid - 1; } else{ low = mid + 1; } } return -1; }
//斐波那契查找 #define MAX_SIZE 30 void fibonacci(int * f){ f[0] = 0; f[1] = 1; for (int i = 2; i < MAX_SIZE; i++){ f[i] = f[i-1] + f[i-2]; } } int fibonacci_Search(int * array,int len,int key){ int low = 0; int high = len -1; int f[MAX_SIZE]; fibonacci(f);//创建斐波那契数列 int k; for (k = 0; k < MAX_SIZE; k++){//寻找最小匹配的斐波那契数 if (f[k] >= len){ break; } } for (int i = len; i < f[k]; i++){//补齐不足的位置 array[i] = array[high]; } while (low <= high){ int mid = low + f[k-1] -1;//斐波那契查找效率高,因为在计算机里 加法 比 除法简单. if (key > array[mid]){ low = mid + 1; k = k-2; } else if(key < array[mid]){ high = mid - 1; k = k - 1; } else{ if (mid <= high){//这一步 不懂 return mid; } else{ return -1; } } } return -1; }斐波那契查找 不是 每次 查找 表长的 一半,而是 用 某个 斐波那契数 分割 表。斐波那契比 二分查找 效率高 是因为 二分 查找 在计算 mid时用的是除法:int mid = (low + high) /2 ;而 斐波那契 用 的是 加法:int mid = low + f[k-1] -1; 但是 斐波那契算法 需要 表长 必须为 某个斐波那契数 -1,所以 需要 表要 留有一些空间。
//插值查找 //顺序表+ 均匀分布 int insertValue_Search(int * array,int len,int key){ int low = 0; int high = len -1; while (low <= high){ //根据比例查找 int mid = low + (high-low)*((key-array[low])/(array[high]-array[low]));//根二分查找仅此区别 int midValue = array[mid]; if (midValue > key){ high = mid -1; } else if(midValue < key){ low = mid +1; } else{ return mid; } } return -1; }
看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)
标签:二分查找 线性查找 斐波那契查找 插值查找 静态查找表
原文地址:http://blog.csdn.net/fuming0210sc/article/details/45147453