查找——順序查找

###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

相關文章
相關標籤/搜索