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