这里在这段代码中我面临的问题是关于我的输出找到正确的索引的键。pivot元素的输出是正确的,但我无法在代码的关键索引部分找到错误。能帮我调试一下吗,或者至少告诉我哪里做错了。
这是一个代码,我试图找到一个排序旋转数组中的关键元素的索引,我的方法如下首先我必须找到枢轴元素比我比较枢轴索引处的元素的大小和关键元素的大小,如果大小大于枢轴而小于数组的大小,则在枢轴和(n-1)之间进行二分搜索:数组的最后一个索引并且如果大小小于i,则在第0个索引和枢轴索引之间搜索。
请纠正我的错误。
#include<bits/stdc++.h>
using namespace std;
int getPivot ( int arr[] , int size){
int start =0;
int end = size-1;
int mid = start + ( end - start)/2;
while( start < end ){
if( arr[mid] > arr[0]){
start = mid +1;
}
else{
end = mid;
}
mid = start + ( end - start )/2;
}
return end;
}
int binarySearch ( int arr[] , int size , int s , int e , int key){
int start = s;
int end = e;
int mid = s+( e-s )/2;
while ( start <= end ){
if( arr[mid] == key){
return mid;
}
else if ( arr[mid] > key ){
end = mid -1;
}
else{
start = mid +1;
}
mid = start+( end - start )/2;
}
return start ;
}
int main(){
int n,k;
cin>>n>>k;
int arr[n];
for( int i=0; i<n; i++){
cin>>arr[i];
}
int pivot = getPivot( arr , n);
cout<<" the index of Pivot element is : "<<pivot<<endl;
if( k >= arr[pivot] && k<= arr[n-1] ){
cout<<" the index of the key is : " <<binarySearch( arr , n , pivot , ( n-1) , k)<<endl;
}
else{
cout<<" the index of the key is : " <<binarySearch( arr , n , 0 , (pivot-1) , k)<<endl;
}
return 0;
}
2条答案
按热度按时间d8tt03nd1#
这看起来很有意思:
int mid = s+( e-s )/2;
它没有正确地使用模算术。将
arr[mid]
与归一化与未规范化坐标以及如何应用于重新计算二分搜索循环的每次迭代的开始和结束。您希望在“归一化”空间中重新计算start
和end
,但mid
需要根据透视索引值进行调整。int
main
看起来也很可疑:如果我理解正确的话,该算法接受了一个可以旋转的排序数组。其中从stdin读取的输入可以是如下内容:
所以在上面的例子中,如果
key==4
,那么我们希望返回8
作为索引,因为array[8] == 4
这里是你的代码的一个清理版本。主要变化如下:
1.使用正确的标题包括
1.删除了可变长度数组并替换为std::vector。
1.修正了binarySearch中的bug。此外,
e
参数实际上并不需要这个修复,所以我删除了它。1.如果找不到元素,binarySearch将返回
-1
,而不是start
1.修正了
main
,以一致的方式调用binarySearch
的大小和枢轴索引。不需要有两个版本的调用它。也不需要显式传递结束索引。getPivot
也有一些bug。所以我用类似的模运算修正了这个问题。fbcarpbf2#
Java中使用二进制查找算法在旋转排序数组中检索索引
二叉查找算法伪代码流程:
1.将ans变量初始化为-1。
1.将startIndex设置为0,将endIndex设置为size - 1。
1.计算midIndex作为startIndex和endIndex的平均值。
9.返回ans的值,如果找到键,则表示键的索引;如果没有找到,则返回-1。
迭代方法
在此发现全面的解决方案https://github.com/Amir36036/ds/blob/array/src/main/java/org/ds/array/FIndKeyINRotatedSortedArray.java