package com.atguigu.sort
import com.atguigu.sort.InsertSorrt.insertSort
import scala.util.Random
/**
* @author wade
* @create 2019-04-08 17:54
*/
object MergeSort {
def main(args: Array[String]): Unit = {
// val arr = Array(11,7,4,9,2,10,66,44,99,26)
val temp = new Array[Int](arr.length)
mergeSort(arr,0,arr.length-1,temp)
println(arr.mkString(" "))
val arr = new Array[Int](80000000)
val temp = new Array[Int](arr.length)
val random = new Random()
for(i <- 0 until arr.length){
arr(i) = random.nextInt(80000000)
}
println("=====排序开始=====")
val start: Long = System.currentTimeMillis()
mergeSort(arr,0,arr.length-1,temp)
val end: Long = System.currentTimeMillis()
println("共耗时毫秒"+(end - start))
}
def mergeSort(arr: Array[Int], left:Int, right:Int, temp:Array[Int]):Unit={
/**
* 第一步,先进行递归分解
*/
if(left<right){
//中间位置索引
val mid: Int = (left+right)/2
//向左递归
mergeSort(arr,left,mid,temp)
//向右递归
mergeSort(arr,mid+1,right,temp)
//进行合并
merge(arr,left,mid,right,temp)
}
def merge(arr: Array[Int], left: Int, mid: Int, right: Int, temp: Array[Int]) = {
/**
* 先把 left->mid mid+1->right
* 进行一一对比,然后按顺序放在temp中
* 排序完成后
* 对 arr的left到right下标按temp的值进行一一赋值
*/
var i = left
var j = mid+1
var t = 0
while(i<=mid && j<=right){
if(arr(i)<arr(j)){
temp(t) = arr(i)
t+=1
i+=1
}else{
temp(t) = arr(j)
t+=1
j+=1
}
}
//循环完毕,肯定有一边还有元素
while(i <= mid){
temp(t) = arr(i)
t+=1
i+=1
}
while(j <= right){
temp(t) = arr(j)
t+=1
j+=1
}
//temp里面已经是从0开始有序的一段数组了
//赋值到对应的arr下标对应的值里面
t = 0
for ( tempIndex <- left to right){
arr(tempIndex) = temp(t)
t+=1
}
}
}
}