function findHelper(leftIndex, rightIndex,arr, el){
var left=arr[leftIndex]
var right=arr[rightIndex]
var centerIndex=Math.round((leftIndex+rightIndex)/2)
var center=arr[centerIndex]
console.log(leftIndex+":"+rightIndex)
if(right==el){
return rightIndex
}
if(left==el){
return leftIndex
}
if(center==el){
return centerIndex
}
if(Math.abs(leftIndex-rightIndex)<=2){ // no element found
return 0;
}
if(left<center){ //left to center are sorted
if(left<el && el<center){
return findHelper (leftIndex, centerIndex, arr, el)
}
else{
return findHelper (centerIndex, rightIndex, arr, el)
}
}
else if(center<right){//center to right are sorted
if(center<el && el<right){
return findHelper (centerIndex, rightIndex, arr, el)
}
else{
return findHelper (leftIndex, centerIndex, arr, el)
}
}
}
function find(el, arr){
return findHelper(0, arr.length-1, arr,el)+1
}
// some testcases
console.log(find(1, [1,2,5,8,11,22])==1)
console.log(find(2, [1,2,5,8,11,22])==2)
console.log(find(5, [1,2,5,8,11,22])==3)
console.log(find(8, [1,2,5,8,11,22])==4)
console.log(find(11, [1,2,5,8,11,22])==5)
console.log(find(22, [1,2,5,8,11,22])==6)
console.log(find(11, [11,22, 1,2,5,8])==1)
console.log(find(22, [11,22, 1,2,5,8])==2)
console.log(find(1, [11,22, 1,2,5,8])==3)
console.log(find(2, [11,22, 1,2,5,8])==4)
console.log(find(5, [11,22, 1,2,5,8])==5)
console.log(find(8, [11,22, 1,2,5,8])==6)
EDIT:
上記のアルゴリズムは、バイナリサーチと同じ複雑さを有します。
「スワップソートされた配列を任意の点で分割すると、少なくとも1つの結果の配列をソートしなければならず、もう1つは(少なくとも)スワップソートする必要があります。がソートされた配列の範囲内にない場合、ソートされた配列の範囲外にあることはできません。ソートされた配列またはスワップのソートされた配列のいずれかを検索し続けます。同じアルゴリズムをもう一度使うこともできます(誘導による証明)。
いくつか例を挙げることができますか? – Zabuza
[回転ソートされた配列内の数値を検索する](https://stackoverflow.com/questions/1878769/searching-a-number-in-a-rotated-sorted-array)の可能な複製 –