1. 程式人生 > >時間超限解決方法之折半查詢法定位置

時間超限解決方法之折半查詢法定位置

刷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;
    }
}