###1、順序查找的概念 順序查找(Sequential Search)是最簡單的一種查找方法。其基本思想是:從線性表的一端開始,依次將每一個記錄的關鍵字與給定值進行比較,若某個記錄的關鍵字等於給定值,表示查找成功,返回記錄序號;若將線性表中全部記錄都比較完,仍未找到關鍵字與給定值相等的記錄,則表示查找失敗,返回一個查找失敗的標誌值算法
###2、順序查找的實現 ####順序查找數組
/** *簡單的順序查找 * */ int SeqSearch(int s[], int n, int key) { int i; for (i=0; i<n && s[i]!=key; i++) //循環查找關鍵字 ; // 空循環 if (i<n) //查找成功,返回序號 return i; else //查找失敗,返回失敗值 return -1; }
####順序查找測試函數
#include <stdio.h> #include "SeqSearch.c" #define ARRAYLEN 8 int main() { int key, i, pos; int source[ARRAYLEN] = {69, 65, 90, 37, 92, 6, 2}; printf("請輸入查找關鍵字:"); scanf("%d", &key); pos = SeqSearch(source, ARRAYLEN, key); printf("原數據:"); for (i=0; i< ARRAYLEN; i++) printf("%d ", source[i]); printf("\n"); if (pos > 0) printf("查找成功,關鍵字%d位於數組的第%d個位置\n", key, pos); else printf("查找成功,關鍵字%d不在數組中\n", key); }
###3、順序查找簡單優化 在以上的SeqSearch函數中,第7~8行是順序查找的主要部分,在這部分循環語句中,每循環一次 都須要進行兩個比較(i<n和r[i]!=key),若是靜態查找表中的數據不少,兩次比較則須要進行較長時間,程序的效率會顯著下降。這時,可對SeqSearch算法進行改進,在建立靜態查找表時,在該表的末端增長一個空的單元,用來保存查找的關鍵字。這樣,確保靜態查找表中有一個與查找關鍵字相同的數據,就不須要使用條件i<n進行判斷了。每次查找時,查找表中老是能找到關鍵字,怎樣判斷是否查找成功呢?其實,只須要判斷,如果找了n+1個元素才找到關鍵值,則表示查找失敗測試
####SeqSearch函數優化優化
int SeqSearch(int s[], int n, int key) { int i; for (i=0; s[i]!=key; i++) //循環查找關鍵字 ; // 空循環 if (i<n) //查找成功,返回序號 return i; else //查找失敗,返回失敗值 return -1; }
####SeqSearch函數優化後測試code
#include <stdio.h> #include "SeqSearch.c" #define ARRAYLEN 8 int main() { int key, i, pos; int source[ARRAYLEN+1] = {69, 65, 90, 37, 92, 6, 2}; printf("請輸入查找關鍵字:"); scanf("%d", &key); source[ARRAYLEN+1] = key; pos = SeqSearch1(source, ARRAYLEN+1, key); printf("原數據:"); for (i=0; i< ARRAYLEN; i++) printf("%d ", source[i]); printf("\n"); if (pos >= 0) printf("查找成功,關鍵字%d位於數組的第%d個位置\n", key, pos); else printf("查找失敗,關鍵字%d不在數組中\n", key); }
###4、順序查找的特色 優勢:對靜態查找表中數據的順序沒有要求。若須要建立動態查找表,能夠方便地將查找不成功的數據添加到查找表的末尾。 缺點:速度慢,在最壞的狀況下,查找成功須要進行n次比較,查找失敗須要進行n+1次比較。io