搜索交换排序的不同整数数组

时间:2017-10-14 23:03:43

标签: arrays algorithm search computer-science divide-and-conquer

上下文:如果有一些k,则不同整数的数组A [1..n]称为交换排序, 1≤k≤n,因此在A之前移动A的最后n-k个元素(按它们出现在A中的顺序) A的前k个元素导致排序的数组。 (注意,不同整数的排序数组是交换排序的: 取k = n。)此外,交换排序数组必须在增加顺序

示例:[4,5,6,1,2,3] =>将[1,2,3]向前移动到[1,2,3,4,5,6],这被视为交换排序。 (增加订单)

非示例:[3,2,1,6,5,4] =>将[6,5,4]移到前面以获得[6,5,4,3,2,1],因为降序而不被视为交换分类。

我需要一个算法Search(A,x),给定一个交换排序的不同整数A和a的数组 整数x,返回索引i,1≤i≤n,如果存在这样的索引,则A [i] = x;如果没有,则返回0 索引存在。

算法应在O(log n)时间内运行,其中n是A的长度。

有谁知道如何处理这个问题?分而治之肯定似乎是一种方法,我只是想不到步骤。

1 个答案:

答案 0 :(得分:0)

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)

编辑:

上述算法与二进制搜索具有相同的复杂性。

为了正确我会做类似的事情:“如果你在一个任意点拆分交换排序数组,至少必须对一个结果数组进行排序,另一个必须(至少)交换排序。如果元素是不在排序数组的范围内,它不能在该数组中,如果它在范围内,它不能在排序数组之外。我们继续在排序数组或交换排序数组中搜索。因为任何排序数组是我们也可以再次使用相同的算法。(通过归纳证明)。“