经典的十个排序问题--scala版本

经典十大排序

swap

 def swap(array: Array[Int], i: Int, j:Int): Unit ={
    val tmp = array(i)
    array(i) = array(j)
    array(j) = tmp
  }

冒泡

 def bubblingSort(array: Array[Int]): Array[Int] ={
    val arr = array
    for(i <- 1 until arr.length){
      for(j <- 0 until arr.length-i){
        if(arr(j) > arr(j+1)) swap(arr, j, j+1)
      }
    }
    arr
  }

选择

 def choiceSort(array: Array[Int]): Array[Int] ={
    val arr = array
    for(i <- 0 until arr.length){
      var min = i
      for(j <- i+1 until arr.length){
        if(arr(j) < arr(min)) min = j
      }
      if(i != min) swap(arr, i, min)
    }
    arr
  }

插入

 def insertSort(array: Array[Int]): Array[Int] ={
    val arr = array
    for(i <- 1 until arr.length){
      var tmp = arr(i)
      var j = i - 1
      while (j>=0 && tmp < arr(j)){
        arr(j + 1) = arr(j)
        j-=1
      }
      arr(j + 1) = tmp
    }
    arr
  }

希尔

 def shellSort(array: Array[Int]): Array[Int] = {
    val arr = array
    var d = arr.length
    while (d >= 1) {
      for (k <- 0 until d) {
        var i = k + d
        while (i < arr.length) {
          var tmp = arr(i)
          var j = i - d
          while (j >= 0 && tmp < arr(j)) {
            arr(j + d) = arr(j)
            j -= d
          }
          arr(j + d) = tmp
          i += d
        }
      }
      d /= 2
    }
    arr
  }

归并

// An highlighted block
 def mergeSort(array: Array[Int]): Array[Int] = {
    if (array == null || array.length <= 1) {
      return array
    }
    val mid = array.length / 2
    val left = java.util.Arrays.copyOfRange(array, 0, mid)
    val right = java.util.Arrays.copyOfRange(array, mid, array.length)
    merge(mergeSort(left), mergeSort(right))
  }

  def merge(left: Array[Int], right: Array[Int]): Array[Int] = {
    val res = new Array[Int](left.length + right.length)
    var index_left = 0
    var index_right = 0
    for (i <- 0 until res.length) {
      if (index_left >= left.length) {
        res(i) = right(index_right)
        index_right += 1
      } else if (index_right >= right.length) {
        res(i) = left(index_left)
        index_left += 1
      } else if (left(index_left) < right(index_right)) {
        res(i) = left(index_left)
        index_left += 1
      } else {
        res(i) = right(index_right)
        index_right += 1
      }
    }
    res
  }

快速排序

// An highlighted block
 def quickSort(array: Array[Int]): Array[Int] = {
    val arr = array
    quick(arr, 0, arr.length-1)
    arr
  }
  
  def quick(array: Array[Int], low:Int, hight:Int): Unit ={
    var i = low
    var j = hight
    if(i > j){
      return
    }
    var temp = array(i)
    while (i < j){
      while (i<j && temp<=array(j)){
        j-=1
      }
      while (i<j && temp>=array(i)){
        i+=1
      }
      if(i < j){
        swap(array, i, j)
      }
    }
    swap(array, low, i)
    quick(array, low, j-1)
    quick(array, i+1, hight)
  }

计数排序

// An highlighted block
 def countSort(array: Array[Int]): Array[Int] = {
    val arr = array
    val max = arr.max
    val min = arr.min

    val rateArray = new Array[Int](max - min + 1)
    for (i <- 0 until arr.length) {
      rateArray(arr(i) - min) += 1
    }

    var index = 0
    var index_rate = 0
    while (index_rate < rateArray.length) {
      if (rateArray(index_rate) != 0) {
        arr(index) = min + index_rate
        index += 1
        rateArray(index_rate) -= 1
      } else {
        index_rate += 1
      }
    }
    arr
  }

桶排序

// An highlighted block
 def bucketSort(array: Array[Int]): Array[Int] = {
    val arr = array
    val max = arr.max
    val min = arr.min

    val nums = (max - min) / arr.length + 1
    val buckets = new Array[ArrayBuffer[Int]](nums)

    for (i <- 0 until nums) {
      buckets(i) = new ArrayBuffer[Int]()
    }

    for (i <- 0 until arr.length) {
      val n = (arr(i) - min) / arr.length
      buckets(n) += (arr(i))
    }

    for (i <- 0 until buckets.size) {
      buckets(i).sorted
    }

    var index = 0
    for (i <- 0 until buckets.size) {
      for (j <- 0 until buckets(i).size) {
        arr(index) = buckets(i)(j)
        index += 1
      }
    }
    arr
  }

基数

 def radixSort(array: Array[Int]): Array[Int] = {
    var arr = array
    val max = arr.max

    var exp = 1
    while ((max / exp) > 0) {
      val temp = new Array[Int](arr.length)
      val buckets = new Array[Int](10)

      for (value <- arr) {
        buckets((value / exp) % 10) += 1
      }

      for (i <- 1 until 10) {
        buckets(i) += buckets(i - 1)
      }
// An highlighted block
      for (i <- (0 until arr.length).reverse) {
        temp(buckets((arr(i) / exp) % 10) - 1) = arr(i)
        buckets((arr(i) / exp) % 10) -= 1
      }
      arr = temp

      exp *= 10
    }

    arr
  }

def heapSort(array: Array[Int]): Array[Int] = {
    val arr = array
    var right = arr.length - 1;
    while (right > 0) {
      for (i <- (0 to (right - 1) / 2).reverse) {
        if (i * 2 + 1 >= 0 && i * 2 + 1 <= right && arr(i * 2 + 1) > arr(i)) {
          swap(arr, i * 2 + 1, i)
        }
        if (i * 2 + 2 >= 0 && i * 2 + 2 <= right && arr(i * 2 + 2) > arr(i)) {
          swap(arr, i * 2 + 2, i)
        }
      }
      swap(arr, 0, right)
      right -= 1
    }
    arr
  }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elvis_hui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值