Skip to content

Commit 69b151c

Browse files
authored
Update 费氏搜寻法.c
1 parent 3334c73 commit 69b151c

File tree

1 file changed

+108
-1
lines changed

1 file changed

+108
-1
lines changed

费氏搜寻法/费氏搜寻法.c

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,108 @@
1-
#
1+
#include<stdio.h>
2+
#include<stdlib.h>
3+
#include<time.h>
4+
#define MAX 15
5+
#define SWAP(x,y) {int t; t = x; x = y; y = t;}
6+
7+
void createfib(void); // 建立费氏数列
8+
int findx(int); // 找x值
9+
int fibsearch(int[], int); // 费氏搜寻
10+
void quicksort(int[], int, int); // 快速排序
11+
12+
int Fib[MAX] = {-999};
13+
14+
//主程序(C/OC)
15+
16+
int main(void){
17+
18+
int number[MAX] = {0};
19+
int i, find;
20+
21+
srand(time(NULL));
22+
23+
for(i = 1; i <= MAX; i++) { //产生随机数列
24+
number[i] = rand() % 10;
25+
}
26+
27+
quicksort(number, 1, MAX); //快速排序
28+
29+
printf("数列:"); //打印排序后的数列
30+
for(i = 1; i <= MAX; i++)
31+
printf("%d ", number[i]);
32+
find = 7; //要寻找的对象
33+
if((i = fibsearch(number, find)) >= 0)
34+
printf("找到数字于索引 %d ", i);
35+
else
36+
printf("\n找不到指定数");
37+
38+
printf("\n");
39+
}
40+
//建立费氏数列,总共求得MAX+1个斐波那契数
41+
void createfib(void) {
42+
int i;
43+
Fib[0] = 0;
44+
Fib[1] = 1;
45+
46+
for(i = 2; i < MAX; i++)
47+
Fib[i] = Fib[i-1] + Fib[i-2];
48+
}
49+
50+
//找x值
51+
int findx(int n) {
52+
int i = 0;
53+
while(Fib[i] <= n)
54+
i++;
55+
i--;
56+
return i;//找到第i个Fib元素小于等于MAX+1
57+
}
58+
59+
//费式搜寻
60+
int fibsearch(int number[], int find) {
61+
int i, x, m;
62+
63+
createfib(); //创建斐波那契数列
64+
65+
x = findx(MAX+1); //斐波那契数列中第x个数刚好不大于MAX+1。MAX是确定的,所以比较的起始点是确定的。
66+
m = MAX - Fib[x]; //得到一个较小的差值。m的值也是确定的。
67+
printf("\nx = %d, m = %d, Fib[x] = %d\n\n",
68+
x, m, Fib[x]);
69+
70+
x--;
71+
72+
i = x;
73+
74+
if(number[i] < find) //i的初值也是确定的。
75+
i += m;
76+
77+
while(Fib[x] > 0) { //搜寻,x值不断减小,范围越来越小,搜寻越来越精细
78+
if(number[i] < find) //小于被搜寻的值
79+
i += Fib[--x]; //右移搜寻位置
80+
else if(number[i] > find) //大于被搜寻值
81+
i -= Fib[--x]; //左移搜寻位置
82+
else
83+
return i; //相等,找到
84+
}
85+
return -1; //搜寻步子已经最小,还是没找到,搜寻结束
86+
}
87+
88+
//快速排序
89+
void quicksort(int number[], int left, int right) {
90+
int i, j, k, s;
91+
92+
if(left < right) {
93+
s = number[(left+right)/2];
94+
i = left - 1;
95+
j = right + 1;
96+
97+
while(1) {
98+
while(number[++i] < s) ; // 向右找
99+
while(number[--j] > s) ; // 向左找
100+
if(i >= j)
101+
break;
102+
SWAP(number[i], number[j]);
103+
}
104+
105+
quicksort(number, left, i-1); // 对左边进行递回
106+
quicksort(number, j+1, right); // 对右边进行递回
107+
}
108+
}

0 commit comments

Comments
 (0)