2014-04-05 27 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

对于二进制搜索,数组应按升序或降序排列。