scala快速排序

scala快速排序

排序原理

1、找一个基准key
2、拿该key开始从后往前遍历,判断该key是否大于arr(j),如果key<=arr(j),则j往前移,反之则交换,然后i往后移,如果key>=arr(i),则i往后移,反之则交换,同理,一直到i==j
例子:10,9,8,7,6,5,4,3,2,1,0
下面是每一步的输出结果:
0 9 8 7 6 5 4 3 2 1 10
0 9 8 7 6 5 4 3 2 1 10
0 9 8 7 6 5 4 3 2 1 10
0 9 8 7 6 5 4 3 2 1 10
0 1 8 7 6 5 4 3 2 9 10
0 1 8 7 6 5 4 3 2 9 10
0 1 8 7 6 5 4 3 2 9 10
0 1 8 7 6 5 4 3 2 9 10
0 1 8 7 6 5 4 3 2 9 10
0 1 8 7 6 5 4 3 2 9 10
0 1 2 7 6 5 4 3 8 9 10
0 1 2 7 6 5 4 3 8 9 10
0 1 2 7 6 5 4 3 8 9 10
0 1 2 7 6 5 4 3 8 9 10
0 1 2 7 6 5 4 3 8 9 10
0 1 2 7 6 5 4 3 8 9 10
0 1 2 7 6 5 4 3 8 9 10
0 1 2 7 6 5 4 3 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 6 5 4 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10

scala代码
package com.data.read.sort

/**
  * @author wdh
  *         created  by  2020.7.14
  * @define  fastsort(快速排序)
  *          1、找一个基准key
  *          2、拿该key开始从后往前遍历,判断该key是否大于arr(j),如果key<=arr(j),则j往前移,反之则交换,然后i往后移,如果key>=arr(i),则i往后移,反之则交换,同理,一直到i==j
  */
object FastSort {
  def main(args: Array[String]): Unit = {
    val array = Array(10,9,8,7,6,5,4,3,2,1,0)
    fastSort(array, 0, array.length-1).foreach(println)
  }

  def fastSort(arr1: Array[Int], low: Int, high: Int): Array[Int] = {
    //定义一个基准key
    var arr = arr1
    var key = arr(low)
    //拿到排序的下限
    var i = low
    //拿到排序的上限
    var j = high
    //判断是否进入循环
    while (i < j) {
      //判断i<j并且基准key是否大于当前值,从右往左遍历拿到比他小的值
      while (i < j && key <= arr(j)) {
        j = j - 1
      }
      if (arr(i) == arr(j) && i < j) {
        i = i + 1
      } else {
        var temp = arr(j)
        arr(j) = arr(i)
        arr(i) = temp
      }
//      println(key, i, j)
      println(arr.mkString("    "))
      //判断i<j并且基准key是否小于于当前值,从左往右遍历拿到比它大的值
      while (i < j && key >= arr(i)) {
        i = i + 1
      }
      if (arr(i) == arr(j) && i < j) {
        i = i + 1
      } else {
        var temp = arr(j)
        arr(j) = arr(i)
        arr(i) = temp
      }
//      println(key, i, j)
      println(arr.mkString("    "))
    }
    arr = if ((i - 1) > low) fastSort(arr, 0, i - 1) else arr
    arr = if ((j + 1) < high) fastSort(arr, i + 1, high) else arr
    arr
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值