scala 快速排序

import scala.collection.mutable.ListBuffer

/**
  * Created by Administrator on 2016/6/25.
  * 快速排序:首先找一个基准元素,通常取第一个或最后一个元素作为基准元素,然后,
  * 从右向左遍历,找到第一个比基准元素小的元素,并记录下当前元素的索引right,两者交换,
  * 交换完成后,就开始从左往右遍历,找到第一个比基准元素大的元素或者left和right相等,就把left和right位置的元素交换。
  * 这样经过一次遍历后,序列就会分成两部分,一部分都是比基准元素小的,在左边,另一部分都是比基准元素大的,在右边。
  * 然后就可以分别对这两部分以同样的方式排序,最终达到整个有序。
  *
  */
object QuickSort {
  def main(args: Array[String]) {
    var buffer = ListBuffer(49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51)
    println("sort before......")
    for(item <- buffer) {
      print(item + " ")
    }
    println()
    quickSort(buffer, 0, buffer.size - 1)

    println("sort after......")
    for(item <- buffer) {
      print(item + " ")
    }
  }

  def quickSort(buf: ListBuffer[Int], low: Int, high: Int): Unit = {
    if(low < high) {
      val baseline_index = getBaselineIdx(buf, low, high)
      quickSort(buf, low, baseline_index - 1)
      quickSort(buf, baseline_index + 1, high)
    }
  }
  def getBaselineIdx(buf: ListBuffer[Int], low: Int, high: Int): Int = {
    var low_ = low
    var high_ = high
    val tmp = buf(low_)

    while(low_ < high_) {
      while(low_ < high_ && buf(high_) >= tmp) {
        high_ = high_ - 1
      }
      buf(low_) = buf(high_)

      while(low_ < high_ && buf(low_) <= tmp) {
        low_ = low_ + 1
      }
      buf(high_) = buf(low_)
    }
    buf(low_) = tmp
    low_
  }
}

你可能感兴趣的:(scala)