若依舊採用每次詢問時線性遍歷陣列來查詢是否存在我們需要查詢的元素,那麼,該演算法的時間複雜度達到了o(n * m)(查詢次數 * 每次查詢所需比較的個數),而這已經達到了千萬數量級。
#include #include struct student;
int main()
}buf[1000];
int main () //輸入
sort(buf,buf + n); //對陣列排序使其按照學號公升序排列
int t;
scanf ("%d",&t); //有t組詢問
while (t -- != 0)
else if (tmp > 0) top = mid - 1; // 若大於,則結束下標變為中間點前乙個點下標
else base = mid + 1; //若小於,則開始點下標變為中間點後乙個點座標
}if (ans == -1)
else printf("%s %s %s %d\n",buf[ans].no,buf[ans].name,buf[ans].***,buf[ans].age); //若查詢成功}}
return 0;
}
利用二分查詢,原本o(n * m)的時間複雜度被優化到o(nlogn(排序) + m * logn),而該複雜度是符合要求。
在乙個公升序有序的陣列中,確定乙個下標點,使在這個下標點之前(包括該下標點)的數字均小於等於目標數字(該目標數字一定大於等於陣列中最小的數字),而陣列的其餘部分均大於目標數字,如何編寫程式。
//存在乙個公升序有序的陣列buf,其大小為size,目標數字為target
int base = 0 , top = size; //初始情況與二分查詢一致
while (base <= top)
int ans = top; //最後,top即為要求的數字陣列下標,buf[top]為該數字本身
查詢學生資訊 九度教程第18題
題目描述 輸入n個學生的資訊,然後進行查詢。輸入 輸入的第一行為n,即學生的個數 n 1000 接下來的n行包括n個學生的資訊,資訊格式如下 01 李江 男 21 02 劉唐 男 23 03 張軍 男 19 04 王娜 女 19 然後輸入乙個m m 10000 接下來會有m行,代表m次查詢,每行輸入...
九度1069 查詢學生資訊(折半 線性查詢)
題目1069 查詢學生資訊 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 7855 解決 2124 題目描述 輸入n個學生的資訊,然後進行查詢。輸入 輸入的第一行為n,即學生的個數 n 1000 接下來的n行包括n個學生的資訊,資訊格式如下 01 李江 男 21 02 劉唐 男 23 ...
Day of week 九度教程第7題
其大意為,輸入乙個日期,要求輸出該日期為星期幾。星期幾是以七為週期迴圈的,那麼只需要知道 1.今天是星期幾 2.今天和所給定的那天相隔幾天。利用其對7求餘數便可以知道所給定的那天是星期幾。include include define isleapyeap x x 100 0 x 4 0 x 400 ...