C++ 實現帶監視哨的順序查詢演算法
阿新 • • 發佈:2020-03-27
監視哨往往是程式裡面的一個變數,如果是對數字排序的話,那麼該變數一般是數值型變數。變數的賦值就相當於哨兵,當排序數列中出現與哨兵相等的值或有某種既定關係出現時,就做一種操作,比如說停止排序,或進行下一趟排序。
舉例:
順序檢索的演算法描述如下
int Search_Sequen(SSTable ST,KeyType key){ //線上性表ST中順序檢索其關鍵字等於Key的資料元素, //若找到,函式值為該元素在表中的位置,否則為-1. ST.element[ST.length].key=key; //設定監視哨 i=0; while(ST.element[i].key!=key) i++; if(i<ST.length) return i; else return -1; }
正文
之前在牛客網上做習題發現的這個獨特的順序查詢,第一次聽到“監視哨”這個說法,就查了一下
具體實現就是將陣列的第0位置空,在查詢時將要查詢的key插入作為監視哨
這樣的好處是不用每次迴圈都檢查查詢是否結束,減少了元素比較次數,
最後的返回值要麼是元素下標要麼是陣列第0位(這種情況就是到了監視哨)
以下是我的程式碼
#include <iostream> using namespace std; template<class T> int linear_search(T& arr,int key) { int length = sizeof(arr) / sizeof(arr[0]); int i = length; arr[0] = key; while (arr[i] != key) { i--; } return i; } int main() { int array[] = { 0,7,9,10,11,15 }; int len = sizeof(array) / sizeof(array[0]); cout << linear_search(array,10); return 0; }
這裡順帶提一下,vs2019會出現一個
error C2760: 語法錯誤: 意外的令牌“識別符號”,預期的令牌為“;”
的錯誤,具體原理我不是很懂,單給出一個解決辦法:
專案->屬性->C/C++->語言->符合模式->否
最後給自己提一下醒,陣列作為函式引數是傳入陣列首位的指標,指標是不帶有陣列其他屬性的,
所以要在函式內獲得陣列的長度,只能用引用和模板的形式傳入陣列本身,這樣就能用sizeof()獲取陣列長度了
總結
到此這篇關於C++ 實現帶監視哨的順序查詢的文章就介紹到這了,更多相關c++ 監視哨順序查詢內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!