#include
#include
#include <string.h>
//顺序表查找
//从头到尾逐个比较,找到就返回下标,找不到返回0
//时间复杂度O(n)
int Sequential_Search(int *array, int len, int key){
int i;
array[0] = key;
i = len;
while(array[i] != key){
i--;
}
return i;
}
void Sequential_Sear(){
int arr[] = {0,3,2,6,5,3,7,8,1}; //注意0号元素不放实际数据,用来存放key
int key = 70;
int get = Sequential_Search(arr,8,key); //顺序查找
printf(" key is in %d ",get);
}
//end
//折半查找(二分查找)
//先对要查找的线性表排序,然后取中间记录比较,不符合就在中间到头(或尾)的一半查找,每次取查找区域的中间位置
//时间复杂度O(log n)
//由于折半查找的前提条件需要有序表顺序存储,对于静态查找表,一次排序后不再变化,这样的算法已经比较好了。
//但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,就不建议使用
int Binary_Search(int *array, int len, int key){
int low,high,middle;
low = 0;
high = len-1;
while(low <= high){
//middle = (low+high)/2;
middle = low + (high - low) * (key - array[low]) / (array[high] - array[low]);
if(key < array[middle]){
high = middle - 1;
}else if(key > array[middle]){
low = middle + 1;
}else{
return middle;
}
}
return 0;
}
void Binary_Sear(){
int arr[] = {23,45,1,43,87,5,4,98,77};
int len = 9;
int key = 5;
//先排序
int i,j;
for(i=0;i1;i++){
for(j=0;j1;j++){
if(arr[j] > arr[j+1]){
int t;
t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
printf("after sort arr[]:");
for(i=0;i1;i++){
printf(" %d ",arr[i]);
}
printf("\nkey(%d) is in %d ",key,Binary_Search(arr,len,key)); //二分查找
}
//end
/*
插值查找(折半查找的改进)
把middle = (low+high)/2;
改为middle = low + (high - low) * (key - array[low]) / (array[high] - array[low]);
把原来的1/2改进成(key - array[low]) / (array[high] - array[low])
平均效率要比折半查找好的多
*/
int Fibonacci_Search(int *array, int len, int key){
int F[] = {0,1,1,2,3,5,8,13,21,34,55,89};
int low,high,mid,i,k;
low = 1;
high = len;
k = 0;
while(len > F[k]-1){
k++;
}
for(i=len;i1;i++){
array[i] = array[len];
}
while(low <= high){
mid = low+F[k-1]-1;
if(key < array[mid]){
high = mid -1;
k = k - 1;
}else if(key > array[mid]){
low = mid + 1;
k = k - 2;
}else{
if(mid <= len){
return mid;
}else{
return len;
}
}
}
return 0;
}
void Fibonacci_Sear(){
int arr[] = {0,23,45,1,43,87,5,4,98,77};
int len = 10;
int key = 77;
//先排序
int i,j;
for(i=0;i1;i++){
for(j=0;j1;j++){
if(arr[j] > arr[j+1]){
int t;
t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
printf("after sort arr[]:");
for(i=0;i){
printf(" %d ",arr[i]);
}
printf("\nkey(%d) is in %d ",key,Fibonacci_Search(arr,len-1,key)); //
}
int main(){
//Sequential_Sear();//顺序查找
// Binary_Sear();//折半查找
Fibonacci_Sear();
return 0;
}