時間超限解決方法之折半查詢法定位置
阿新 • • 發佈:2019-02-08
刷OJ或者打ACM比賽的時候,你會遇到很多得出的結果一樣,但就是時間超限的題目;其實如果出現了這種情況,那麼說明你的這種方法就不對,有以下幾種情況:1.程式碼中迴圈過多 2.演算法不對3.c++的輸入和輸出比c語言的耗時要多4.很多無關緊要的遍歷
本文將講一講對於一個從小到大排序的陣列,如何更快的找到某個數在陣列中的位置-----折半查詢法
思路:先將該數與陣列中間的數進行比較,如果相等,直接就是該數的位置;如果該數大於中間的數,則從(mid + 1)處開始,將之賦值為min,然後在取中間那個位置的數進行比較;如果該數小於中間的數同理:
#include <iostream>
using namespace std;
int main()
{
int a[100];
int i,j,t,n;
cin >> n;
for(i = 0; i < n; i++)
cin >> a[i];
int num,min =0,max = n - 1,flag = 0,loca = 0;
cin >> num;
if(num > a[max] || num < a[0])
cout << "不在陣列範圍內";
else
{
while(flag == 0 && min <= max)
{
int mid = (min+max)/2;
cout << a[mid] << endl;
if(num == a[mid])
{
loca = mid;
flag = 1;
}
else if(num > a[mid])
{
min = mid + 1;
}
else
{
max = mid - 1;
}
}
cout << "陣列元素,位置:" << loca;
}
}