2014-04-05 52 views
0

我寫了如下的二進制搜索。當我試圖找到10時,它沒有向我顯示結果。我在想什麼?我的二分查找算法有什麼問題?

// BinarySearch.cpp : Defines the entry point for the console application. 

//

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

void BinarySearch(int arr[],int value); 
int * insertionshot(int arr[]); 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
int arr[10] = {1,2,3,10,5,9,6,8,7,4}; 
int value; 
cin >> value ; 
static int *ptr;// = new int[10]; 
ptr = insertionshot(arr); 
BinarySearch(ptr,value); 
return 0; 
} 

int * insertionshot(int arr[]) 
{ 
int ar[10]; 
for(int i =0;i < 10; i++) 
{ 
    ar[i] = arr[i]; 
} 

int arrlength = sizeof(ar)/sizeof(ar[0]); 
for(int a = 1; a <= arrlength -1 ;a++) 
{ 
    int b = a; 
    while(b > 0 && ar[b] < ar[b-1]) 
    { 
     int temp; 
     temp = ar[b-1]; 
     ar[b-1] = ar[b]; 
     ar[b] = temp; 
     b--; 
    } 
} 
return ar; 
} 

void BinarySearch(int a[],int value) 
{ 
int min,max,middle; 
min = 0; 
int ar[10]; 
for(int i =0;i < 10; i++) 
{ 
    ar[i] = a[i]; 
} 
//printf("size of array = %d",sizeof(arr)); 
max = (sizeof(ar)/sizeof(ar[0]) -1); 
middle = (min+max)/2; 

while(min <= max) 
{ 
    if(ar[middle] == value) 
    { 
     cout << "The value found" << ar[middle]; 
     break; 
    } 
    else if(ar[middle] < value) 
    { 
     min = middle +1; 
    } 
    else if(ar[middle] > value) 
    { 
     max = middle-1; 
    } 
    middle = (min+max)/2; 
} 
} 

最後我做到了工作,我覺得這個代碼沒有任何problem.This可以幫助任何一個

// BinarySearch.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

void BinarySearch(int arr[],int value); 
int * insertionshot(int arr[],int); 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
int arr[10] = {1,2,3,10,5,9,6,8,7,4}; 
int * arr1 = new int[10]; 
for(int i = 0;i< sizeof(arr)/sizeof(arr[0]);i++) 
{ 
    arr1[i] = arr[i]; 

} 

int value; 
cin >> value ; 
int *ptr = new int[10]; 
ptr = insertionshot(arr1,10); // address of sorted array will be returned. 
BinarySearch(ptr,value); 
arr1 = 0; 
ptr =0; 
delete arr1; 
delete ptr; 
return 0; 
} 

int * insertionshot(int arr1[],int n) 
{ 

for(int a = 1; a <= n -1 ;a++) 
{ 
    int b = a; 
    while(b > 0 && arr1[b] < arr1[b-1]) 
    { 
     int temp; 
     temp = arr1[b-1]; 
     arr1[b-1] = arr1[b]; 
     arr1[b] = temp; 
     b--; 
    } 
} 
return arr1; 
} 

void BinarySearch(int a[],int value) 
{ 
int min,max,middle; 
min = 0; 
int ar[10]; 
for(int i =0;i < 10; i++) 
{ 
    ar[i] = a[i]; 
} 
max = (sizeof(ar)/sizeof(ar[0]) -1); 
middle = (min+max)/2; 

while(min <= max) 
{ 
    if(ar[middle] == value) 
    { 
     cout << "The value found" << ar[middle]; 
     break; 
    } 
    else if(ar[middle] < value) 
    { 
     min = middle +1; 
    } 
    else if(ar[middle] > value) 
    { 
     max = middle-1; 
    } 
    middle = (min+max)/2; 
} 
} 
+0

嗨。要求人們發現代碼中的錯誤並不是特別有效。您應該使用調試器(或者添加打印語句)來分析問題,追蹤程序的進度,並將其與預期發生的情況進行比較。只要兩者發生分歧,那麼你就發現了你的問題。 (然後,如果有必要,您應該構建一個[最小測試用例](http://sscce.org)。) –

+4

首先:二進制搜索需要排序的數組! – P0W

+0

其他人已經解釋了爲什麼你的程序給出你不期望的答案,但是還有其他問題:1.二分搜索應該被分離出它自己的程序,並且2.有許多方法可以編寫程序無論您正在搜索的值的第一次還是最後一次出現,也有可能(但不是確定的)更快。 – dfeuer

回答

6

你錯過binary search最重要的部分:您在中搜索的收藏必須按排序。

+0

我在Wiki中查過,但沒有找到我該如何排序。請給出一個示例代碼。謝謝。 – bapi

+0

@bapi您可以手動初始化陣列,只需很少的項目。將其分類並不難。 –

+0

@bapi,因爲你是一位新手程序員,所以我很好奇你爲什麼使用C++,這是一種特殊的多毛和不愉快的編程語言。 – dfeuer

0

對於二進制搜索,數組應按升序或降序排列。