package com.sort

import scala.collection.mutable.ArrayBuffer
import scala.util.control.Breaks._

/**
  * 简单排序
  */
object TestSort {
  def main(args: Array[String]): Unit = {
    val arr = ArrayBuffer[Int](11, 2, 31, 7, 99, 0)
    //val res = BubbleSort(arr)
    //val res = SelectSort(arr)
    val res = InsertSort(arr)
    for (i <- res) {
      print(i + "\t")
    }
  }

  //冒泡排序
  def BubbleSort(arr: ArrayBuffer[Int]): ArrayBuffer[Int] = {
    //这里用了scala中的breakable类来帮助跳出循环
    for (i <- 0 until arr.length - 1) {
      var flag = true
      breakable {
        for (j <- 0 until arr.length - 1 - i) {
          if (arr(j) > arr(j + 1)) {
            val temp = arr(j)
            arr(j) = arr(j + 1)
            arr(j + 1) = temp
            flag = false
          }
        }
      }
      if (flag)
        break()
    }
    arr
  }

  //插入排序
  def SelectSort(arr: ArrayBuffer[Int]): ArrayBuffer[Int] = {
    //找到每一次最小的数,如果有更小的就交换
    for (i <- 0 until arr.length - 1) {
      var index = i
      var min = arr(i)
      for (j <- i + 1 until arr.length) {
        if (min > arr(j)) {
          index = j
          min = arr(j)
        }
      }
      if (index != i) {
        arr(index) = arr(i)
        arr(i) = min
      }
    }
    arr
  }

  def InsertSort(arr: ArrayBuffer[Int]): ArrayBuffer[Int] = {

    for (i <- 1 until arr.length) {
      //scala中 表示for(int i = 10;i>0;i--)这样的形式一般使用Range方法,最后一个参数为步长,默认为 1
      for (j <- Range(i, 0, -1)) {
        //如果后面的比前面的小就插进去
        if (arr(j) < arr(j - 1)) {
          val temp = arr(j)
          arr(j) = arr(j - 1)
          arr(j - 1) = temp
        }
      }
    }
    arr
  }

}