DS 005 順序表 二分查詢

2021-08-28 14:41:24 字數 1661 閱讀 3518

題目:線性表(a1,a2,a3,…,an)中元素遞增有序且按順序儲存在計算機中。要求設計乙個演算法完成用最少時間在表中查詢值為x的元素,若找到將其與後繼元素位置相交換,若找不到將其插入表中並使表中元素仍遞增有序。

演算法思想:有序順序表,可以用二分查詢(折半查詢)。

int binarysearch(elemtype a, elemtype x) 

return -1; //查不到x,返回-1表示錯誤

136

1318

1524

2835

解析:設定三個變數,low和high指定順序表的第乙個元素和最後乙個元素的下標。mid為中間位置。

while迴圈的出口條件是low>high,比如查詢20這個元素,隨著while的執行,high變小,low變大,查不到元素最終會返回-1。

最後有查詢元素13和20的例子。

程式會返回x所在的位置或者查詢失敗。

主函式呼叫binarysearch()函式

void searchexchangeinsert(elemtype a, elemtype x) 

if(res == -1) //二分查詢只是返回錯誤資訊,沒有找到具體x應該插入的位置

}

解析:

將陣列a和x作為引數傳遞給searchexchangeinsert()函式,binarysearch()函式查詢x所在位置或者返回查詢失敗資訊。

如果 查詢成功且不是最後乙個元素,執行位置交換操作,注意使用中間變數。

如果x在順序表末尾,不能和它後繼元素位置互換,忽略掉就行。

如果查詢失敗,需要將x插入到陣列中的位置,使陣列依然是有序線性表。使用for迴圈,從最後乙個乙個元素開始,將大於x的元素依次右移一位。

最後一次for迴圈,i位置的元素小於x,原來i+1位置(現在右移到i+2位置的)元素大於x。將x放在現在i+1的位置。最後將x插入表中。

查詢13:

low=0

mid=4

high=813

6131822

2428

35

else if (l.data[mid] > x) 

high = mid-1; //x在前半部分,high設定為mid前乙個元素的位置

low=0

mid=1

high =313

613重新設定上界high,刪除了後半部分 

if(l.data[mid] < x) 

low = mid+1; // 中間元素小於x,x在後半部分,low設定為mid下乙個位置

low,mid = 2

high=3613

重新設定下界low

low,high,mid=3

13滿足mid=x,返回mid。

查詢20:

low=0

mid=4

high=813

6131822

2428

35low=5

mid=6

high=8

2224

2835

low,high,mid=5

22此時依然滿足l.data[mid] > x,接著執行 high = mid-1; high

DS靜態查詢 順序 二分 索引

靜態查詢 靜態表是只執行查詢操作,而不執行插入 刪除等操作的表。現在常說的有五大查詢方法 順序查詢 分塊查詢 索引查詢 樹查詢 雜湊查詢。後兩種之前寫過了二叉查詢樹和雜湊表,現在回顧前面三種,它們都屬於順序表查詢。1.順序查詢 思路最簡單的查詢,也就是遍歷一遍看看有沒有相等的元素。可以設定乙個哨兵,...

順序表查詢之二分查詢

二分查詢使用前提 1 線性表中的記錄必須是關鍵碼有序 一般由大到小 2 線性表必須採用順序儲存 3 有序儲存的順序表是靜態查詢表,即不需要頻繁的執行插入或者刪除操作 時間複雜度 o logn include include using namespace std int binary search ...

順序查詢 二分查詢

順序查詢 適用範圍 沒有進行排序的資料序列 缺點 速度非常慢,效率為o n cpp view plain copy 在code上檢視 片派生到我的 片 實現 template type sequencesearch type begin,type end,const type searchvalue...