天天看點

11.靜态查找

實驗11 靜态查找

代碼

#include <iostream>
using namespace std;
#define MAXSIZE 100

struct ElemType
{
	int key; //關鍵字域
	// Other info
};

struct SSTable
{
	ElemType *R;
	int length;
};

// 初始化查找表
void InitSSTable(SSTable &ST)
{
	ST.R = new ElemType[MAXSIZE];
	ST.length = 0;
	if (!ST.R)
	{
		cout << "初始化錯誤" << endl;
		exit(-1);
	}
}

// 銷毀查找表
void DestroySSTable(SSTable &ST)
{
	delete[] ST.R;
}

// 填充查找表
void InsertSSTable(SSTable &ST)
{
	for (int i = 0; i < MAXSIZE; i++)
		ST.R[i].key = i;
	ST.length = MAXSIZE;
}

// 填充查找表, 但是空出0号位置(搜尋的時候存儲哨兵)
void InsertSSTable2(SSTable &ST)
{
	for (int i = 1; i < MAXSIZE; i++)
		ST.R[i].key = i;
	ST.length = MAXSIZE - 1;
}

// 順序查找法
int SeqSearch(SSTable &ST, int key)
{
	for (int i = ST.length; i >= 1; --i)
	{
		if (ST.R[i].key == key)
			return i;
	}
	return 0;
}

// 帶哨兵的順序查找
int SeqSearchWithSentry(SSTable &ST, int key)
{
	ST.R[0].key = key; // 設定哨兵
	int i = ST.length;
	while (ST.R[i].key != key)
		i--;
	return i;
}

// 二分查找
int BinarySearch(SSTable &ST, int key)
{
	int low = 1, high = ST.length;
	int mid;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (key == ST.R[mid].key)
			return mid;
		else if (key < ST.R[mid].key)
			high = mid - 1;
		else
			low = mid + 1;
	}
	return 0; // 沒找到
}

// 顯示搜尋結果
void ShowSearchResult(int result, int testkey)
{
	if (result == 0)
		cout << "未找到" << testkey << endl;
	else
		cout << "找到" << testkey << "位置為" << result << endl;
}

int main()
{
	SSTable ST;
	int testkey1 = 7;
	int testkey2 = 200;

	InitSSTable(ST);
	cout << "-------------------1.順序查找-------------------" << endl;
	InsertSSTable(ST);
	ShowSearchResult(SeqSearch(ST, testkey1), testkey1);
	ShowSearchResult(SeqSearch(ST, testkey2), testkey2);

	cout << "-------------------2.帶監視哨的順序查找----------" << endl;
	InsertSSTable2(ST); // 0 号位置用作哨兵位
	ShowSearchResult(SeqSearchWithSentry(ST, testkey1), testkey1);
	ShowSearchResult(SeqSearchWithSentry(ST, testkey2), testkey2);

	cout << "-------------------3.折半查找--------------------" << endl;
	InsertSSTable(ST);
	ShowSearchResult(BinarySearch(ST, testkey1), testkey2);
	ShowSearchResult(BinarySearch(ST, testkey2), testkey2);
	
	DestroySSTable(ST);
}
           

截圖

11.靜态查找