1 #include<iostream>
2 using namespace std;
3 #define MAXSIZE 100
4
5 int Seq_Search(int *a, int n, int key)
6 {
7 int i;
8 for(i=0; i<n;i++)
9 {
10 if(a[i]==key)
11 return i;
12 }
13 return 0;
14 }
15
16 //折半查找
17 int In_Search(int *a, int n, int key)
18 {
19 int low, high, mid;
20 low = 0;
21 high = n-1;
22 while(low<high)
23 {
24 mid = (low+high)/2;
25 if(a[mid]>key)
26 {
27 high--;
28 }
29 else if(a[mid]<key)
30 {
31 low++;
32 }
33 else
34 return mid;
35 }
36 return 0;
37 }
38
39 //插值查找
40 int Insert_Search(int *a, int n, int key)
41 {
42 int low, high, mid;
43 low = 0;
44 high = n-1;
45 while(low<high)
46 {
47 //插值
48 mid = low + (high-low)*(key-a[low])/(a[high]-a[low]);
49 if(a[mid]>key)
50 {
51 high--;
52 }
53 else if(a[mid]<key)
54 {
55 low++;
56 }
57 else
58 return mid;
59 }
60 return 0;
61 }
62
63 //斐波那契数列
64 void Fibonacci(int *F)
65 {
66 F[0] = 0;
67 F[1] = 1;
68 for(int i=2;i<MAXSIZE;i++)
69 {
70 F[i] = F[i-1] + F[i-2];
71 }
72 }
73
74 //斐波那契查找
75 int Fibonacci_Search(int *a, int n, int key)
76 {
77 int low = 0;
78 int high = n-1;
79 int mid;
80 int F[MAXSIZE];
81 Fibonacci(F);
82 int k =0;
83 while(n>F[k]-1)
84 k++;
85 int *temp = new int[F[k]-1];
86 memcpy(temp,a,n*sizeof(int));
87 for(int i=n;i<F[k]-1;i++)
88 temp[i] = a[n-1];
89
90 while(low<high)
91 {
92 mid = low + F[k-1] - 1;
93 if(key<temp[mid])
94 {
95 high = mid-11;
96 k = k-1;
97 }
98 else if(key>temp[mid])
99 {
100 low = mid+1;
101 k = k-2;
102 }
103 else
104 {
105 if(mid<n)
106 return mid;
107 else
108 return n-1;
109 }
110 }
111 delete[] temp;
112 return -1;
113 }
114
115 int main()
116 {
117 int a[MAXSIZE];
118 for(int i=0;i<MAXSIZE;i++)
119 a[i] = i+1;
120 cout << Seq_Search(a,MAXSIZE,45)<<endl;
121 cout << In_Search(a,MAXSIZE,45)<<endl;
122 cout << Insert_Search(a,MAXSIZE,45)<<endl;
123
124 int arr[] = {0,16,24,35,47,59,62,73,88,99};
125 int key=73;
126 int index=Fibonacci_Search(arr,sizeof(arr)/sizeof(int),key);
127 cout<<key<<" is located at: "<<index;
128
129 system("PAUSE");
130 return 0;
131 }