1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
|
#include<iostream> using namespace std;#define INFINITLY 65535 #define MAXSIZE 100 int F[100]; /* 斐波那契數列 */ /* 無哨兵順序尋找,arr為數組,n為要尋找的數組個數,key為要尋找的關鍵字 */ /* 返回元素的位置pos (下標+1)*/ int Sequential_Search(int *arr, int n, int key) { for (int i = 0; i < n; i++) if (arr[i] == key) return i + 1; return INFINITLY; //返回無窮說明失敗 } /* 有哨兵順序尋找 */ /* 返回元素的位置pos (下標+1)*/ int Sequential_Search2(int *arr, int n, int key) { arr[n] = key; int i = 0; while (arr[i] != key) i++; return i + 1; //返回n+1 則說明失敗 } /* 折半尋找 */ /* 返回元素的下標 */ int Binary_Search(int *arr, int n, int key) { int low = 0;/* 定義最低下標為記錄首位 */ int high = n - 1;/* 定義最高下標為記錄末位 */ int mid; while (low <= high) { mid = (low + high ) / 2;/* 折半 */ if (key < arr[mid])/* 若尋找值比中值小 */ high = mid - 1;/* 最高下標調整到中位下標小一位 */ else if (key > arr[mid])/* 若尋找值比中值大 */ low = mid + 1;/* 最低下標調整到中位下標大一位 */ else return mid;/* 若相等則說明mid即為尋找到的位置 */ } return INFINITLY; } /* 插值尋找 */ int Interpolation_Search(int *arr, int n, int key) { int low = 0; int high = n - 1; int mid; while (low <= high) { /* 插值公式 */ mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]); if (key < arr[mid]) high = mid - 1; else if (key > arr[mid]) low = mid + 1; else return mid; } return INFINITLY; } /* 斐波那契尋找 */ int Fibonacci_Search(int *arr, int n, int key) { int low = 0;/* 定義最低下標為記錄首位 */ int high = n - 1;/* 定義最高下標為記錄末位 */ int i, k = 0; int mid; while (n > F[k] - 1) k++; for (i = n - 1; i < F[k] - 1; i++) arr[i] = arr[n - 1]; while (low <= high) { mid = low + F[k - 1] - 1; if (key < arr[mid]) { high = mid - 1; k = k - 1; } else if (key > arr[mid]) { low = mid + 1; k = k - 2; } else { if (mid <= n - 1) return mid; else return INFINITLY; } } return INFINITLY; } int main(void) { int arr[MAXSIZE] = {1, 16, 24, 35, 47, 59, 62, 73, 88, 99}; int result = Sequential_Search(arr, 10, 24); if (result != INFINITLY) cout << "24 's pos : " << result << endl; result = Sequential_Search2(arr, 10, 59); if (result != sizeof(arr) / sizeof(arr[0])) cout << "59 's pos : " << result << endl; result = Binary_Search(arr, 10, 73); if (result != INFINITLY) cout << "73 's pos : " << result + 1 << endl; result = Interpolation_Search(arr, 10, 16); if (result != INFINITLY) cout << "16 's pos : " << result + 1 << endl; F[0] = 0; F[1] = 1; for(int i = 2; i < 100; i++) { F[i] = F[i - 1] + F[i - 2]; } result = Fibonacci_Search(arr, 10, 88); if (result != INFINITLY) cout << "88 's pos : " << result + 1 << endl; return 0; } |