|
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