package com.atguigu.sort
import scala.util.Random
import scala.util.control.Breaks
/**
* @author wade
* @create 2019-04-07 23:41
*/
object QuickSort {
def main(args: Array[String]): Unit = {
/**
* 从中间分成两个数组
* 左边数组的所有的值要比右边任意一个值都要小
* 然后递归继续循环
*/
// val ints = Array(11,7,4,9,2,10,66,44,99,26)
// println("fsadf")
// quickSort(ints,0,ints.length-1)
//
// println(ints.mkString(" "))
val arr = new Array[Int](80000000)
val random = new Random()
for (i <- 0 until arr.length) {
arr(i) = random.nextInt(80000000)
}
//val arr = Array(2,2,3,6,4)
// 1,2,2,2,6,5,3
println("=====排序开始=====")
val start: Long = System.currentTimeMillis()
quickSort(arr, 0, arr.length - 1)
//quickSort11(0,arr.length-1,arr)
// println(arr.mkString(" "))
val end: Long = System.currentTimeMillis()
println("共耗时毫秒" + (end - start))
}
def quickSort(arr: Array[Int], left: Int, right: Int): Unit = {
var l = left
var r = right
//var mid = (l+r)/2 为什么不用 arr(mid) 来表示中间的值,因为数组在变
var pivot = arr((l + r) / 2)
var temp = 0
/**
* 左边的都比中间值小,右边都比中间值大
*/
Breaks.breakable(
while (l < r) {
while (arr(l) < pivot) {
l += 1
}
while (arr(r) > pivot) {
r -= 1
}
if (l >= r) {
Breaks.break()
}
/**
* 交换
*/
temp = arr(l)
arr(l) = arr(r)
arr(r) = temp
/**
* 下面这两个判断一定要加上
* 1、提高点效率,如果其中一个是pivot,提前减了,少进次循环
* 重点!!
* 2、若两个都是,那么就需要 -1,如果不加,
* 有相同元素的话,会在某次递归中进入死循环
*/
if (arr(l) == pivot) {
r -= 1
}
if (arr(r) == pivot) {
l += 1
}
}
)
if (l == r) {
l += 1
r -= 1
}
//循环完毕 ,那么左边的所有的值都比右边的小
//进行递归
//向左递归
if (left < r) {
quickSort(arr, left, r)
}
//向右递归
if (right > l) {
quickSort(arr, l, right)
}
}
}
/**
2,3,3,6,4
*/