二分法查找例子

#define SEARCH_NOT_FOUND -1 //没有找到查询的目标 /************************************************************************/ /* 二分法查找[递归实现版本] */ /* arr: 待查找的数组 */ /* first: 搜索开始下标 */ /* last: 搜索结束下标的后一位置 */ /* target: 搜索的目标值 */ /* pcount: 查找次数 */ /* 返回值: 搜索到小标位置,如果没有找到则返回SEARCH_NOT_FOUND */ /************************************************************************/ int binarySearchWithRecursion(const int arr[],int first,int last,int target,int *pcount) { if (pcount)//统计查找次数 { (*pcount)++; } if (first<0 || first>=last)//如果开始下标小于零或者开始下标大于或等于结束下标则说明不能找到 { return SEARCH_NOT_FOUND; } int mid = (first+last)/2; if (target==arr[mid])//找到 { return mid; } if (target=parray_end) { return NULL; } do { if (pcount)//如果计数器指针有效那么递增计数器 { (*pcount)++; } const int * parray_mid = parray_start+(parray_end - parray_start)/2;//取得中间指针 if (*parray_mid==target)//如果中间指针的值等于目标值则找到,立即返回该中间指针 { return parray_mid; } if (target<*parray_mid)//如果目标值小于中间指针值则修改子表末尾指针为中间指针[查询前半段] { parray_end = parray_mid; continue; } if (*parray_mid

 

测试:

///////////////////////////////////////////////////////////////////////////// // CDlgDS2 message handlers void CDlgDS2::OnButtonSearch() { // TODO: Add your control notification handler code here int num_array[]={21,22,34,67,87,90,98,99,100}; int count = 9;//数组长度 int findCount=0;//查找次数 //使用递归版本测试 // int index = binarySearchWithRecursion(num_array,0,count,GetDlgItemInt(IDC_EDIT_NUM),&findCount);//查找 // // char msg[32];//显示的消息 // char nums[3]; // itoa(index,nums,10); // // if (index==SEARCH_NOT_FOUND) // { // strcpy(msg,"没有找到这个数"); // SetDlgItemText(IDC_FIND_INDEX,msg); // } else // // { // strcpy(msg,"该数下标:"); // strcat(msg,nums); // strcat(msg,"/n/n查找次数:"); // memset(nums,0,3); // itoa(findCount,nums,10); // strcat(msg,nums); // SetDlgItemText(IDC_FIND_INDEX,msg); // } //使用非递归版本测试1 // const int * parraryIndex = binarySearchWithNoRecursion1(num_array,num_array+count,GetDlgItemInt(IDC_EDIT_NUM),&findCount);//查找 // char msg[32];//显示的消息 // char nums[3]; // itoa(parraryIndex-num_array,nums,10);//parraryIndex-num_array==查找目标在数组中的下标 // // if (parraryIndex==NULL) // { // strcpy(msg,"没有找到这个数"); // SetDlgItemText(IDC_FIND_INDEX,msg); // } // else // { // strcpy(msg,"该数下标:"); // strcat(msg,nums); // strcat(msg,"/n/n查找次数:"); // memset(nums,0,3); // itoa(findCount,nums,10); // strcat(msg,nums); // SetDlgItemText(IDC_FIND_INDEX,msg); // } //使用非递归版本测试2 const int * parraryIndex = binarySearchWithNoRecursion2(num_array,count,GetDlgItemInt(IDC_EDIT_NUM),&findCount);//查找 char msg[32];//显示的消息 char nums[3]; itoa(parraryIndex-num_array,nums,10);//parraryIndex-num_array==查找目标在数组中的下标 if (parraryIndex==NULL) { strcpy(msg,"没有找到这个数"); SetDlgItemText(IDC_FIND_INDEX,msg); } else { strcpy(msg,"该数下标:"); strcat(msg,nums); strcat(msg,"/n/n查找次数:"); memset(nums,0,3); itoa(findCount,nums,10); strcat(msg,nums); SetDlgItemText(IDC_FIND_INDEX,msg); } }

你可能感兴趣的:(C++,VC,汇编)