问题:有一个有序的环形数列,从小到大排好了,比如4, 5, 6, 1, 2, 3,从第四个位置开始当成环形看,就是一个有序数列1, 2, 3, 4, 5, 6。问题是在这个数列重找到给定的关键字。
看到有序,自然想到binary search。这个问题可以用binary search做,每次二分,把数组分成两部分,一部分是普通的有序数列,一部分是原问题。
代码如下:
bool search(int arr[], int b, int e, int k) { if (!arr || b < e || b < 0) return false; int s = b + (e - b)/2; if (arr[s] == k) return true; else if (arr[s] > k) { if (arr[s] > arr[b]) { if (k >= arr[b]) return bsearch(arr, b, s-1, k); else return search(arr, s+1, e, k); } else { return search(arr, b, s-1, k); } } else { if (arr[s] > arr[b]) return bsearch(arr, s+1, e, k); else { if (k >= arr[b]) return search(arr, e, s-1, k); else return bsearch(arr, s+1, e, k); } }
时间: 2024-11-08 12:23:32