日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

查找及其相关算法

發(fā)布時間:2025/3/8 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 查找及其相关算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、靜態(tài)查找表
    • 1.1 順序表查找
    • 1.2 有序表查找
      • 1.2 .1折半查找(二分查找)
  • 二、動態(tài)查找表
  • 三、哈希表

一、靜態(tài)查找表

1.1 順序表查找

1.2 有序表查找

1.2 .1折半查找(二分查找)

優(yōu)點:查找的效率高
缺點:已排好序,只適用于順序存儲

例題:
隨機產(chǎn)生80 個整數(shù)構(gòu)成的遞增序列,
使用折半查找算法查找指定的整數(shù),并統(tǒng)計比較次數(shù)。
提示:可用 a[i] = a[i-1] + rand() % 10 + 1 產(chǎn)生遞增序列。 (1,10-1+1)

/* * rand() % n +a;其中的a是起始值,n-1+a是終止值,n是整數(shù)的范圍*/#include <iostream> using namespace std;int c=0;//折半查找 int Search_bin(int *a, int key) {int low = 1;int high = 80;while (low<=high){c++;int mid=(low + high) / 2;if (key==a[mid]) {return mid;}else if(key<a[mid]){high = mid - 1;}else {low = mid + 1;}}return -1; }int main() {int a[80];for (int i = 1; i <= 80; i++) {if (i == 1) {a[i] = rand() % 10 + 1;}else {a[i] = a[i - 1] + rand() % 10 + 1;}}for (int i = 1; i <= 80; i++) {cout << a[i] << "\t";if (i % 10 == 0) {cout << endl;}}cout << endl;int k;cout << "請輸入你要查找的元素的值:";cin >> k;if (Search_bin(a,k)) {cout << k << "在a[]中位置為:" << Search_bin(a, k) << endl;cout << "比較次數(shù)為:" << c << endl;}else {cout << "不在a中";}return 0; }

1.2.2 索引順序表

二、動態(tài)查找表

二叉排序樹(二叉查找樹)

/* 輸入10 個不同整數(shù),依次插入到一顆初始為空的二叉排序樹中, 并對其進行中序遍歷,以驗證樹的正確性 */ #include <iostream> using namespace std;#define STACK_INIT_SIZE 100 //存儲空間初始分配量 #define STACKINCREMENT 10 //存儲空間分配增量//棧存儲結(jié)構(gòu) typedef struct {int* base; //棧構(gòu)造之前和銷毀之后,值都為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; }/*二叉鏈表存儲結(jié)構(gòu)*/ typedef struct BiTNode {int data;struct BiTNode* lchild, * rchild; }BiTNode, * BiTree;int SearchBST(BiTree T, int key, BiTree f, BiTree& p) //查找成功,參數(shù)p指向查找到的結(jié)點,f指向它的雙親;否則p指向key應(yīng)插入的父結(jié)點或指向空(當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指向二叉排序樹根結(jié)點 {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) // 若二叉樹為空被插結(jié)點作為樹的根結(jié)點T = s; else if (e< p->data) //被插結(jié)點插入到p的左子樹中p->lchild = s;else //被插結(jié)點插入到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 個不同整數(shù):" << 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; }

三、哈希表

總結(jié)

以上是生活随笔為你收集整理的查找及其相关算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。