資料結構(折半查詢)
折半查詢
折半查詢,必須是對有序表(一般為遞增順序)進行查詢,定義low指標為0,首先將有序表中間關鍵字key與要查詢的key進行比較,相等則成功,若表中記錄key大於查詢key,則移動hign指標,high=mid-1;在[low,mid-1]中查詢,若記錄key小於查詢key,則移動low指標,**low=mid+1;**在[mid+1,high]中查詢,當mid值相等時查詢成功.若都不可以則要查詢key不在當前有序表中。
#include <stdio.h> #include<stdio.h> #define MAX 100 //定義表中最多記錄個數 #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)< (b)) typedef int KeyType; typedef struct { KeyType key; //KeyType為關鍵字的資料型別 //其他資料 } SSTable; typedef SSTable SeqList[MAX]; //順序表型別 int BinSearch(SeqList R,int n,KeyType key) //折半查詢演算法R代表位置 { int low=0,high=n-1,mid,count=0; while (low<=high) { mid=(low+high)/2; printf("第%d次比較:在[%d,%d]中比較元素R[%d]:%d\n",++count,low,high,mid,R[mid].key); if (EQ(key,R[mid].key)) //查詢成功返回 return mid; if (LT(key,R[mid].key)) //繼續在R[low..mid-1]中查詢 high=mid-1; else low=mid+1; //繼續在R[mid+1..high]中查詢 } return -1;//查詢失敗返回-1 } int main() { SeqList R; KeyType key; int i,n,a[MAX]; printf("請輸入建立順序表的長度:\n"); scanf("%d",&n); printf("請輸入要建立的順序表:\n"); for(i=0;i<n;i++) scanf("%d",&a[i]); for (i=0;i<n;i++) R[i].key=a[i]; printf("所建有序表為:\n"); for (i=0;i<n;i++) printf("%d ",R[i].key); printf("\n"); printf("輸入要查詢的關鍵字元素:\n"); scanf("%d",&key); printf("查詢%d的結果如下:\n",key); if ((i=BinSearch(R,n,key))!=-1) printf("元素%d的位置是%d\n",key,i); else printf("元素%d不在表中\n",key); }
注意定義low指標是從0開始還是從1開始(本實驗從0開始)
相關推薦
資料結構(折半查詢)
折半查詢 折半查詢,必須是對有序表(一般為遞增順序)進行查詢,定義low指標為0,首先將有序表中間關鍵字key與要查詢的key進行比較,相等則成功,若表中記錄key大於查詢key,則移動hign指標,high=mid-1;在[low,mid-1]中查詢,若記錄k
Java資料結構(十五)—— 多路查詢樹
多路查詢樹 二叉樹和B樹 二叉樹的問題分析 二叉樹操作效率高 二叉樹需要載入到記憶體,若二叉樹的節點多存在如下問題: 問題1:構建二叉樹時,需多次進行I/O操作,對與速度有影響 問題2:節點海量造成二叉樹的高度很大,會降低操作速度 多叉樹 在二叉樹中,每個節點有資料項,最多有兩個子節
資料結構(c語言)——鏈棧儲存結構及實現
鏈棧:就是一種特殊的單鏈表,FILO(先進後出) 通常對於連結串列來說: 1.是不需要頭節點的。 2.基本不存在滿棧的情況,除非記憶體已沒有可用的空間。 不多bibi你們都懂哈,直接上程式碼: 鏈棧結構: typedef struct Stock
資料結構(c語言)——雙向連結串列的基本操作
定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struct DulNode *
java資料結構之折半查詢
折半查詢,也稱二分法查詢、二分搜尋,是一種在有序陣列中查詢某一特定元素的搜尋演算法,這裡強調有序表明這種演算法的特定使用場景; 搜素過程為,從陣列中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束; 如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中
資料結構(十五)排序
排序演算法 0. 前言 本來準備自己寫,無意間看到一位大佬的博文…大家還是移步吧 推薦一套自己開發的演算法演示工具 1. 總結 排序方法 平均時間複雜度 最壞時間複雜度 額外空間複雜度 穩定性
資料結構(十五)最小生成樹
最小生成樹問題 1. 什麼是最小生成樹 是一棵樹 無迴路 |V|個頂點一定有 |V|-1 條邊 是生成樹 不唯一 包含全部頂點 |V|-1 條邊都在圖裡 邊的權值和最小
資料結構(十四)最短路問題
最短路徑問題 1. 概述 1. 抽象 在網路(帶權圖)中,求兩個不同頂點之間的所有路徑中,邊的權值之和最小的那一條路徑 這條路徑就是兩點之間的最短路徑(ShorttestPath) 第一個頂點為源點(Source) 最後一個頂點為終點(Destinatio
資料結構(非線性表)
非線性結構-樹 實驗簡介 前面兩章我們講解了資料結構中的線性結構--線性表、棧和佇列,這章開始以及下一章我們將講解非線性結構樹和圖。 一、樹 什麼是樹呢?樹很好地反應了一種層次結構,例如下圖,這就是一種樹形結構,它有很多結點組成,最上面的實驗樓課程結點稱為樹的根,結點擁
資料結構(C#版)筆記(一)
1.資料結構邏輯結構(Data Structure) 資料結構是相互之間存在一種或多種特定關係的資料元素的集合。在任何問 題中,資料元素之間都不是孤立的,而是存在著一定的關係,這種關係稱為結構 (Structure)。根據資料元素之間關係的不同特性,通常有 4 類基本資料結構
在整型有序陣列中查詢想要的數字, 找到了返回下標,找不到返回-1.(折半查詢)
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int BinarySearch(int a[], int key, int len) { int ret = -1;//找
資料結構(學習中)
預先知識:(C語言) 1、指標 地址:記憶體單元的編號 指標:指標就是地址,地址就是指標 指標變數:就是一個變數,這個變數儲存了一個非負整數,即儲存了記憶體單元的編號的變數,所有指標變數只佔4個位元組(
資料結構(C#版本)_圖
推薦閱讀: 我的CSDN 我的部落格園 QQ群:704621321 頂點的度=頂點的入度+頂點的出度。 頂點 v 的入度是指以該頂點 v 為弧頭的弧的數目;頂點 v 的出度
資料結構(C語言)棧的建立、入棧、出棧並進行進位制轉換
十進位制數轉換為八進位制: | N |N div 8(商) | N mod 8(餘數) |1348| 168 | 4 | 168 | 21 | 0
NOIP模擬 資料結構(線段樹)
【題目描述】 在看了 jiry_2 的課件《Segment Tree Beats!》後,小 O 深深沉迷於這種能單次 O(logn) 支援區間與一個數取 min/max,查詢區間和等資訊的資料結構,於是他決定做一道與區間與 一個數取 min/max 的好題。 這題是這樣的
資料結構(c語言)--雙向連結串列的基本操作
定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struc
資料結構(c語言)——鏈佇列儲存結構及實現
是佇列鴨,FIFO,先進先出! 對於帶頭節點的和不帶頭節點的鏈佇列的操作有個小小的區別: 不帶頭結點的鏈佇列在入佇列的時候,第一個元素時要先判斷是否為空,再插入。而帶頭結點不需要,操作更方便些; 我是分割線-----------------------------
資料結構(歸併排序)
1,二路歸併排序設計思路 與快速排序一樣,歸併排序也是基於分治策略的排序,(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。歸併排序將待排序的元素分成兩個長度相等的子序列,分別為每一
面試準備-資料結構(持續更新)
1、二叉查詢樹 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 任意節點的左、右子樹也分別為二叉查詢樹。 沒有鍵值相等的節點(no duplicate nodes)。 2
Java常用資料結構(個人筆記)
寫在前面: 樓主剛打完ACM徐州現場賽,也算是退役了,現在準備重新補一遍Java,之前一直用的是C++,所以我會結合C++來整理Java的資料結構,同時也便於理解。 那麼我將按照以下順序進行講解,感覺難度也是逐步提升 ArrayList、Vector和Lin