查找及其相关算法
文章目錄
- 一、靜態查找表
- 1.1 順序表查找
- 1.2 有序表查找
- 1.2 .1折半查找(二分查找)
- 二、動態查找表
- 三、哈希表
一、靜態查找表
1.1 順序表查找
1.2 有序表查找
1.2 .1折半查找(二分查找)
優點:查找的效率高
缺點:已排好序,只適用于順序存儲
例題:
隨機產生80 個整數構成的遞增序列,
使用折半查找算法查找指定的整數,并統計比較次數。
提示:可用 a[i] = a[i-1] + rand() % 10 + 1 產生遞增序列。 (1,10-1+1)
1.2.2 索引順序表
二、動態查找表
二叉排序樹(二叉查找樹)
/* 輸入10 個不同整數,依次插入到一顆初始為空的二叉排序樹中, 并對其進行中序遍歷,以驗證樹的正確性 */ #include <iostream> using namespace std;#define STACK_INIT_SIZE 100 //存儲空間初始分配量 #define STACKINCREMENT 10 //存儲空間分配增量//棧存儲結構 typedef struct {int* base; //棧構造之前和銷毀之后,值都為NULLint* top; //棧頂指針int stacksize; //當前已分配的存儲空間,以元素為單位 }SqStack;/*初始化*/ int InitStack(SqStack& S) {S.base = (int*)malloc(STACK_INIT_SIZE * sizeof(int));if (!S.base) //存儲分配失敗exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return 1;} /*判斷棧是否為空*/ int StackEmpty(SqStack S) {if (S.base == S.top)return 1;elsereturn 0; }/*插入*/ int Push(SqStack& S, int e) {//e 新的棧頂元素if (S.top - S.base >= S.stacksize) {S.base = (int*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(int));if (!S.base)exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return 1; } /*刪除棧頂元素并返回其值*/ int Pop(SqStack& S, int& e) {if (S.top == S.base)return 0;e = *--S.top;return 1; }/*二叉鏈表存儲結構*/ typedef struct BiTNode {int data;struct BiTNode* lchild, * rchild; }BiTNode, * BiTree;int SearchBST(BiTree T, int key, BiTree f, BiTree& p) //查找成功,參數p指向查找到的結點,f指向它的雙親;否則p指向key應插入的父結點或指向空(當T為空時) {if (!T){p = f;return 0;}else if (key == T->data){p = T;return 1;}else if (key < T->data)return (SearchBST(T->lchild, key, T, p));elsereturn (SearchBST(T->rchild, key, T, p)); }int InsertBST(BiTree& T, int e) //在二叉排序樹中插入值為elem的元素,T指向二叉排序樹根結點 {BiTree p = NULL, f = NULL;if (!SearchBST(T, e, f, p)) // 如果查找不成功{BiTree s = (BiTree)malloc(sizeof(BiTNode));s->data = e;s->lchild = s->rchild = NULL;if (!p) // 若二叉樹為空被插結點作為樹的根結點T = s; else if (e< p->data) //被插結點插入到p的左子樹中p->lchild = s;else //被插結點插入到p的右子樹中p->rchild = s; return 1;}else // 查找成功,不插return 0; }/*非遞歸中序遍歷*/ void InOrderTraverse(BiTree t) {SqStack S;InitStack(S);BiTree p = t;while (p || !StackEmpty(S)){if (p) {Push(S, (int)p);p = p->lchild;}else {Pop(S, (int&)p);cout << p->data;p = p->rchild;}}}int main() {int a[10];cout << "輸入10 個不同整數:" << endl;for (int i = 0; i < 10; i++) {cin >> a[i];}BiTree t;for (int i = 0; i < 10; i++) {InsertBST(t,a[i]);}InOrderTraverse(t);return 0; }三、哈希表
總結
- 上一篇: 图的基本操作及其相关应用
- 下一篇: 数据结构复习总结