首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在执行快速排序时正确地找到旋转元素?

如何在执行快速排序时正确地找到旋转元素?
EN

Stack Overflow用户
提问于 2019-11-19 21:15:25
回答 2查看 56关注 0票数 0

我有一个包含以下元素的数组:var arr = Array[Int](10,16,8,12,15,6,3,9,5),我正在尝试使用快速排序技术对其进行排序。下面是我用来进行快速排序的代码:

代码语言:javascript
复制
object Quick {
def main(args: Array[String]): Unit = {
    var arr   = Array[Int](10,16,8,12,15,6,3,9,5)
    var low   = 0
    var high  = arr.length-1
    quickSort(low, high)
    arr.foreach(println)

    def quickSort(low:Int, high:Int):Unit = {
        if(low<high) {
            var j = partition(low, high)
            quickSort(low, j)
            quickSort(j+1, high)
        }
    }

    def partition(low:Int, high:Int): Int = {
        var pivot = arr(low)
        var i = low
        var j = high
        while(i<j) {
            do {
                i += 1
            } while(arr(i) <= pivot)
            do {
                j -= 1
            } while(arr(j) > pivot)
            if(i<j) swap(i, j)
        }
        swap(i, j)
        j
    }

    def swap(ai:Int, aj:Int): Unit = {
        var tmp = arr(ai)
        arr(ai) = arr(aj)
        arr(aj) = tmp
    }
}

}

当我运行代码时,它在行:while(arr(i) <= pivot)处中断,其中索引将变为9,我首先处理了这一行,而通过添加条件if(i < arr.length-1) i += 1,同样的情况也发生在第二行do中,而行:while(arr(j) > pivot)中的索引通过以ArrayOutOfBoundsException结尾而变成了-1。我通过添加一个条件来处理它:if(j>0) j-= 1如果我添加了这些条件,代码将进入无限循环,但我删除了它们,结果是索引为:9& -1的ArrayOutOfBoundsException分别表示低和高。

谁能让我知道我在这里做的错误是什么?

EN

回答 2

Stack Overflow用户

发布于 2019-11-19 23:41:47

我不知道scala,但问题中的代码可能会超出(low,high)的界限。分区循环依赖于loops for elements == pivot来防止这种情况。注释中注明的修复:

代码语言:javascript
复制
        var pivot = arr(low)           // any but arr(high)
        var i = low-1                  // fix
        var j = high+1                 // fix
        while(i<j) {
            do {
                i += 1
            } while(arr(i) < pivot)    // fix (not <=) 
            do {
                j -= 1
            } while(arr(j) > pivot)
            if(i<j) swap(i, j)
        }
                                       // fix (no post loop swap)
        j
    }

您可能会考虑稍微更改一下(可以提高性能)。注意,退出while(true)的唯一方法是返回j。

代码语言:javascript
复制
        var pivot = arr(low)
        var i = low-1
        var j = high+1
        while(true) {
            do {
                i += 1
            } while(arr(i) < pivot)
            do {
                j -= 1
            } while(arr(j) > pivot)
            if(i >= j) return j
            swap(i, j)
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2019-11-19 23:43:57

我认为你在分区中的代码太复杂了。正确的示例:

代码语言:javascript
复制
def partition(low:Int, high:Int): Int = {
  val pivot = arr(high)
  var i = low - 1
  var j = low
  while (j <= high - 1) {
    if (arr(j) < pivot) {
      i += 1
      swap(i, j)
    }
    j += 1
  }
  swap(i + 1, high)
  i + 1
}

def quickSort(low:Int, high:Int):Unit = {
  if(low<high) {
    val j = partition(low, high)
    quickSort(low, j - 1)
    quickSort(j+1, high)
  }
}

rest代码相同。来自:geeksforgeeks

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58934991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档