排序-4.快速排序

快速排序是对冒泡排序法的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

实例:

要求:对[11, 10, 9, 1, -1]进行从小到大的排序,要求使用快速排序法。

代码实现

package chapter18.sort

import java.text.SimpleDateFormat
import java.util.Date

import scala.util.control.Breaks._

object QuickSort {
  def main(args: Array[String]): Unit = {
    println("---------------------功能测试-------------------------")
    val arr1 = Array(11, 10, 9, 1, -1)
    //        val arr1 = Array(-9, 78, 0, 23, -567, 70)
    quickSort(0, arr1.length - 1, arr1)
    println("排序后")
    println(arr1.mkString(" "))
    println("---------------------性能测试-------------------------")
    //使用快速排序,时间小于1秒
    val random = new util.Random()
    val arr = new Array[Int](80000)
    for (i <- 0 until 80000) { //循环生成随机数
      arr(i) = random.nextInt(8000000)
    }
    println("排序前")
    val now: Date = new Date()
    val dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    val date = dateFormat.format(now)
    println("排序前时间 = " + date) //输出时间
    //println(arr.mkString(" "))
    //    quickSort(0, arr.length - 1, arr) // 排序
    println("排序后")
    //println(arr.mkString(" "))
    val now2: Date = new Date()
    val date2 = dateFormat.format(now2)
    println("排序后时间 = " + date2) //输出时间
  }

  /**
   * 从小到大,快速排序
   *
   * @param left  指定从数组的左边的下标 0
   * @param right 指定从数组的右边的下标 length -1
   * @param arr   进行排序的数组
   */
  def quickSort(left: Int, right: Int, arr: Array[Int]): Unit = {
    var l = left //左边下标
    var r = right //右边下标
    val pivot = arr((left + right) / 2) //以中间的值为基准进行分割
    var temp = 0
    breakable {
      while (l < r) { // while语句的作用就是把比pivot小的数放左边,比pivot大的数放到右边。
        while (arr(l) < pivot) { // 从左边找一个比pivot大的值对应的下标
          l += 1
        }
        while (arr(r) > pivot) { // 从右边找一个比pivot小的值对应的下标
          r -= 1
        }
        //        println(s"l=${l},r=${r} =>" + arr.mkString(" ")) //测试
        if (l >= r) { //说明本次交换结束,退出本次while
          break()
        }
        // 交换
        temp = arr(l)
        arr(l) = arr(r)
        arr(r) = temp
        // 处理后,如果发现arr(l) == pivot,不再进行比较,就r-=1,提高效率
        if (arr(l) == pivot) {
          r -= 1
        }
        if (arr(r) == pivot) {
          l += 1
        }
      }
    }
    if (l == r) { // 为了提高效率
      l += 1
      r -= 1
    }
    // 向左递归
    if (left < r) {
      //      println("左递归")
      quickSort(left, r, arr)
    }
    //向右递归
    if (right > l) {
      //      println("右递归")
      quickSort(l, right, arr)
    }
  }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值