為什麼要把這兩個看似不相干的東西總結在一起呢?因為他們利用了相同的原理。
(1)順序查詢中無非就是陣列的遍歷,使用for迴圈遍歷陣列之後,每次迴圈節都會做一次比較,看看該節點的元素是否等於所查
找的元素。這樣的話如果長度為n則有可能進行n次比較,所以這裡進行一下改進。
陣列mydata[ max] 的儲存從下標為1開始儲存元素,每次把所要查詢的元素放在0的位置,所以
for (int i =max - 1; mydata [ i ]!=mydata[ 0 ];i--) ;
這樣乙個for把兩個判斷迴圈結束的條件放在了一起,那麼省掉了一半的判斷,當然其實還是o(n)的複雜度,
(2)堆的上濾操作是吧剛剛插入的元素通過上濾找到它的合適位置,其實也是乙個查詢的過程,只不過是一種逆向的二分查詢。
原理和上面類似:
在這裡,使用陣列模擬堆,利用乘二建樹,所以0號空間自然不能被利用,這裡我們先按小根堆進行舉例,就把乙個極小的值放
在這裡,使所有可能插入的值都不會比它更小。然後就可以把兩個判斷迴圈結束的條件放在一起。
因為堆的上濾需要找的乙個位置它的父節點比它小,所以如果找不到的話,它就是最小的,自動賦值到1號空間,因為0號是絕對小
於他們的。
順序表的順序查詢和折半查詢
順序查詢 include using namespace std intseqsearch int r,int n,int k return i int main int k cout 請輸入要查詢的數 k for int i 1 i n i cout 該數在陣列中的位置為 cout seqsear...
大頂堆和小頂堆的上濾和下濾
總結一下 上濾一般應用於在乙個已經排序好的二叉堆中插入乙個新節點。首先在堆末新建乙個空間,稱為空穴,然後比較穴的值和其父節點的值。從巨集觀上看,空穴會自下而上地到達滿足堆序的位置。下濾一般應用於刪除了堆頂後的堆序重整過程中。刪除堆頂後把新的堆頂放置在滿足堆序的正確的位置上。分兩種情況 若是大頂堆 哪...
順序查詢和折半查詢
順序查詢可以是線性表也可以是鍊錶,同是既可以是有序的也可以是無序。折半查詢僅適用於有序的線性表 include include define elemtype inttypedef struct sstable 表的資料結構 void creatss sstable st 建立線性表 void pr...