1. 程式人生 > >算法第二章上機實驗報告

算法第二章上機實驗報告

現在 while 下標 總結 考過 include names 以及 問題

1、實踐題目

7-1 二分查找 (20 分)

輸入n值(1<=n<=1000)、n個非降序排列的整數以及要查找的數x,使用二分查找算法查找x,輸出x所在的下標(0~n-1)及比較次數。若x不存在,輸出-1和比較次數。

輸入格式:

輸入共三行:第一行是n值;第二行是n個整數;第三行是x值。

輸出格式:

輸出x所在的下標(0~n-1)及比較次數。若x不存在,輸出-1和比較次數。

輸入樣例:

4

1 2 3 4

1

輸出樣例:

0

2

2、問題描述

本道題是讓我們輸入非降序排列的整數,也就是說是排好序的了,然後輸入我們要查找的數字,如果找到了,就輸出所找的那個數在數組中的位置並輸出比較的次數;如果沒有找到的話,就輸出-1還有比較的次數。

3、算法描述

使用二分法查找,每查找一次,問題規模減小為原來的一般,即將輸入的序列存在一個數組裏,假設要查找的數字為x,那麽就是讓x與a[n/2]比較。如果兩者相等的話,那麽x就找到了,算法結束。若是不相等的話,則根據x是大於a[n/2]還是小於a[n/2]決定是要在哪一部分裏繼續尋找。若x>a[n/2],則在數組的右半部分繼續尋找;若x<a[n/2],則在數組的左半部分繼續尋找。

代碼如下:

#include <iostream>

using namespace std;

int BinarySearch(int a[],int x,int n){

int left = 0;

int right =n-1;

int count =0;

while(left <= right){

int middle = (left + right)/2;

count++;

if(x== a[middle]){

cout<<middle<<endl;

cout<<count;

return middle;

}

if(x>a[middle]){

left =middle + 1;

}

else {

right = middle -1;

}

}

cout<<"-1"<<endl;

cout<<count;

return -1;

}

int main(){

int n;

cin>>n;

int *a=new int[n];

for(int i=0; i<n;i++){

cin>>a[i];

}

int x;

cin>>x;

BinarySearch(a,x,n);

return 0;

}

4、算法時間及空間復雜度分析(要有分析過程)

對於n個元素:

第一次二分:n/2
第二次二分:n/2^2
......
m次二分:n/(2^m)
2^m=n;

故時間復雜度為:log2n
空間復雜度:因為各個變量的空間復雜度都是O(1),所以算法空間復雜度為O(1)。

5、心得體會(對本次實踐收獲及疑惑進行總結)
這次的二分查找算法實踐,加深了我對二分法的理解。因為書本上有二分法查找的相關內容,我們沒出現大問題。問題是出現在數組的定義上。我們一起找,沒找到,最後上網查了一下才知道原來是我們數組定義的時候出了錯!真的是有認真思考過才會印象深刻,因為我們在檢查的過程中一遍又一遍的看我們寫的代碼,所以現在是比較熟悉,在被第一道題目困住,最後解決之後,第二道題目很快就做出來了。

算法第二章上機實驗報告