1. #include "stdio.h"
    2. #include "stdlib.h"
    3. #include "io.h"
    4. #include "math.h"
    5. #include "time.h"
    6. #define OK 1
    7. #define ERROR 0
    8. #define TRUE 1
    9. #define FALSE 0
    10. #define MAXSIZE 100 /* 存储空间初始分配量 */
    11. typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
    12. int F[100]; /* 斐波那契数列 */
    13. /* 无哨兵顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键字 */
    14. int Sequential_Search(int *a,int n,int key)
    15. {
    16. int i;
    17. for(i=1;i<=n;i++)
    18. {
    19. if (a[i]==key)
    20. return i;
    21. }
    22. return 0;
    23. }
    24. /* 有哨兵顺序查找 */
    25. int Sequential_Search2(int *a,int n,int key)
    26. {
    27. int i;
    28. a[0]=key;
    29. i=n;
    30. while(a[i]!=key)
    31. {
    32. i--;
    33. }
    34. return i;
    35. }
    36. /* 折半查找 */
    37. int Binary_Search(int *a,int n,int key)
    38. {
    39. int low,high,mid;
    40. low=1; /* 定义最低下标为记录首位 */
    41. high=n; /* 定义最高下标为记录末位 */
    42. while(low<=high)
    43. {
    44. mid=(low+high)/2; /* 折半 */
    45. if (key<a[mid]) /* 若查找值比中值小 */
    46. high=mid-1; /* 最高下标调整到中位下标小一位 */
    47. else if (key>a[mid])/* 若查找值比中值大 */
    48. low=mid+1; /* 最低下标调整到中位下标大一位 */
    49. else
    50. {
    51. return mid; /* 若相等则说明mid即为查找到的位置 */
    52. }
    53. }
    54. return 0;
    55. }
    56. /* 插值查找 */
    57. int Interpolation_Search(int *a,int n,int key)
    58. {
    59. int low,high,mid;
    60. low=1; /* 定义最低下标为记录首位 */
    61. high=n; /* 定义最高下标为记录末位 */
    62. while(low<=high)
    63. {
    64. mid=low+ (high-low)*(key-a[low])/(a[high]-a[low]); /* 插值 */
    65. if (key<a[mid]) /* 若查找值比插值小 */
    66. high=mid-1; /* 最高下标调整到插值下标小一位 */
    67. else if (key>a[mid])/* 若查找值比插值大 */
    68. low=mid+1; /* 最低下标调整到插值下标大一位 */
    69. else
    70. return mid; /* 若相等则说明mid即为查找到的位置 */
    71. }
    72. return 0;
    73. }
    74. /* 斐波那契查找 */
    75. int Fibonacci_Search(int *a,int n,int key)
    76. {
    77. int low,high,mid,i,k=0;
    78. low=1; /* 定义最低下标为记录首位 */
    79. high=n; /* 定义最高下标为记录末位 */
    80. while(n>F[k]-1)
    81. k++;
    82. for (i=n;i<F[k]-1;i++)
    83. a[i]=a[n];
    84. while(low<=high)
    85. {
    86. mid=low+F[k-1]-1;
    87. if (key<a[mid])
    88. {
    89. high=mid-1;
    90. k=k-1;
    91. }
    92. else if (key>a[mid])
    93. {
    94. low=mid+1;
    95. k=k-2;
    96. }
    97. else
    98. {
    99. if (mid<=n)
    100. return mid; /* 若相等则说明mid即为查找到的位置 */
    101. else
    102. return n;
    103. }
    104. }
    105. return 0;
    106. }
    107. int main(void)
    108. {
    109. int a[MAXSIZE+1],i,result;
    110. int arr[MAXSIZE]={0,1,16,24,35,47,59,62,73,88,99};
    111. for(i=0;i<=MAXSIZE;i++)
    112. {
    113. a[i]=i;
    114. }
    115. result=Sequential_Search(a,MAXSIZE,MAXSIZE);
    116. printf("Sequential_Search:%d \n",result);
    117. result=Sequential_Search2(a,MAXSIZE,1);
    118. printf("Sequential_Search2:%d \n",result);
    119. result=Binary_Search(arr,10,62);
    120. printf("Binary_Search:%d \n",result);
    121. result=Interpolation_Search(arr,10,62);
    122. printf("Interpolation_Search:%d \n",result);
    123. F[0]=0;
    124. F[1]=1;
    125. for(i = 2;i < 100;i++)
    126. {
    127. F[i] = F[i-1] + F[i-2];
    128. }
    129. result=Fibonacci_Search(arr,10,62);
    130. printf("Fibonacci_Search:%d \n",result);
    131. return 0;
    132. }