旋转数组的二分法查找

来源:互联网 发布:淘宝运营月工作计划表 编辑:程序博客网 时间:2024/05/22 08:02
/*一数组, array [] = {1,2,3,4,5,6,7,8,9};从某一位置开始旋转,变为以下数组array_ex[] = {6,7,8,9,1,2,3,4,5};现在给定一个数值x,查找x是否在该数组array_ex中算法思想:1.如果数组为有序数组,没有移位的话,则直接用二分法查找即可2.如果有移位的话,则满足arr[left] >= arr[right].出现这样的情况,不能直接判断数值是否在该序列中,应该继续划分。 mid = (left + right)/2. 利用[left,mid]和[mid, right)继续1步骤,如果其中一个分组满足步骤1的话,就不需要再继续2步骤*/#include<iostream>using namespace std;bool find_data(int*arr , int left, int right, int data, int& loop_cnt){loop_cnt = 0x00;if(arr[left] >= arr[right]){bool b_stop = false;int mid = 0x00;while(!b_stop && left < right){loop_cnt++;mid = (left + right) / 0x02;//防止死循环。主要是因为[left,right]为非有序空间的时候,循环的时候不能使//left=mid+1或right=mid-1if((right - left) <= 0x01){if(arr[left] != data && arr[right] != data){b_stop = true;continue;}}if(arr[left] <= arr[mid]){//查找到data可能所在的序列空间if(arr[left] <= data && arr[mid] >= data){right = mid;b_stop = true;}else{left = mid;}}else if(arr[mid] <= arr[right]){//查找到data可能所在的序列空间if(arr[mid] <= data && arr[right] >= data){left = mid;b_stop = true;}elseright = mid;}}}//执行到这里,[left,right]或为有序空间,或不存在if(arr[left] > data || arr[right] < data)return false;//使用二分法查找数据while(left <= right){loop_cnt++;int mid = (left + right) / 0x02 ;if(arr[mid] == data)return true;if(arr[mid] > data)right = mid - 0x01;else left = mid + 0x01;}return false;}void show_array(int* arr, int len){for(int index = 0x00; index < len; index++)std::cout<<arr[index]<<" ";std::cout<<std::endl;}int main(){int array[100] = {0x00};int lp_index = 0x00;for(int index = 30; index < 100; index++){array[lp_index++] = index;}for(int index = 0x00; index < 30; index++){array[lp_index++] = index;}show_array(array,100);for( int index = 0x00; index < 200; index += 5){int loop_cnt = 0x00;bool ret = find_data(array, 0x00, 99, index,loop_cnt);if(ret)std::cout<<" find data "<<index<<" ok . loop_cnt is :"<<loop_cnt<<std::endl;elsestd::cout<<" find data "<<index<<" failed. loop_cnt is :"<<loop_cnt<<std::endl;}return 0x00;}

原创粉丝点击