您将获得一个排序和旋转的数组,如下所示:
int arr[]={16,19,21,25,3,5,8,10};
如果您注意到数组已排序和旋转。您需要以 o(log n) 时间复杂度搜索上述数组中的元素。
您可以使用线性搜索在上述数组中搜索元素,但这需要 o(n)。 您可以使用二进制搜索算法的变体来解决上述问题。您可以使用可以将数组划分为两个排序的子数组({16,19,21,25},{3,5,8,10} )的属性,尽管您不需要找到枢轴点(元素开始减少)。
算法:
让我们借助示例来理解这一点。
在上述数组中搜索 5 涉及的步骤:
用于在已排序和旋转的数组中搜索元素的 Java 程序: 创建一个名为的类
SearchElementSortedAndRotatedArrayMain.java。
package org.arpit.java2blog; public class SearchElementSortedAndRotatedArrayMain { public static void main(String[] args) { int arr[]={16,19,21,25,3,5,8,10}; System.out.println("Index of element 5 : "+findElementRotatedSortedArray(arr,0,arr.length-1,5)); } public static int findElementRotatedSortedArray(int[] arr,int low,int high,int number) { int mid; while(low<=high) { mid=low + ((high - low) / 2);; if(arr[mid]==number) { return mid; } if(arr[mid]<=arr[high]) { // Right part is sorted if(number > arr[mid] && number <=arr[high]) { low=mid+1; } else { high=mid-1; } } else { // Left part is sorted if(arr[low]<=number && number < arr[mid]) { high=mid-1; } else { low=mid+1; } } } return -1; } }
当你运行上面的程序时,你会得到以下输出:
Index of element 5 : 5