1. 程式人生 > >資料結構(折半查詢)

資料結構(折半查詢)

折半查詢

折半查詢,必須是對有序表(一般為遞增順序)進行查詢,定義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