scala实现冒泡排序、插入排序、选择排序、快速排序、归并排序

  1. 冒泡排序
def bubbleSort(array: Array[Int]):Unit={
    var swap = true//设置swap值,如果没有发生交换则证明已经有序,不必再继续循环
    var temp = 0
    for(i <- 0 until array.length if swap == true){
      swap = false
      for(j<- 0 until array.length-i-1){//注意这里的判断条件
        if(array(j)>array(j+1)){
          temp = array(j)
          array(j) = array(j+1)
          array(j+1) = temp
          swap = true
        }
      }
    }
  }
  1. 插入排序
def insertSort(array: Array[Int]):Unit={
    var temp = 0;
    var index = 0
    for(i<- 1 until array.length){
      if(array(i)<array(i-1)){
        temp = array(i);
        for(j<- (0 to i-1) reverse; if array(j)>temp){
          array(j+1) = array(j)
          index = j
        }
        array(index) = temp//注意插入位置
      }
    }
  }
  1. 选择排序
def selectSort(array: Array[Int]): Unit ={
    var k:Int = 0
    var min:Int = 0
    for(i <- 0 until array.length){
      min = array(i)
      k = i
      for(j <- i until array.length){
        if(min > array(j)) {
          min = array(j)
          k = j   //注意k值和min都要随着变化
        }
      }
      if(k != i){
        array(k) = array(i)
        array(i) = min
      }
    }
  }
  1. 快速排序
def quickSort(array: Array[Int],start:Int,end:Int):Unit={
    if(end - start <= 0) return//注意递归退出条件
    val pivot = array(start)
    var i = start
    var j = end
    while (i<j){
      while (i<j && array(j)>=pivot) j -= 1
      array(i) = array(j)  //注意这里直接覆盖即可,无需交换
      while (i<j && array(i)<=pivot) i += 1
      array(j) = array(i)
    }
    array(i) = pivot
    quickSort(array,start,i-1)
    quickSort(array,i+1,end)
  }
  1. 归并排序
def mergeSort(array: Array[Int],low:Int,high:Int):Unit={

    if (low < high){ //注意这里应该使用if判断而不是while
      val mid = low + (high - low)/2
      mergeSort(array,low,mid)
      mergeSort(array,mid+1,high)
      merge(array,low,mid,high)
    }
  }

  def merge(array: Array[Int],low:Int,mid:Int,high:Int):Unit={
    var i = low
    var j = mid + 1
    val temp = new Array[Int](high-low+1)//使用了一个临时数组,也可以定义为全局的,减少每次申请内存的消耗
    var k = 0
    while (i<=mid&&j<=high){
      if (array(i)<=array(j)){
        temp(k) = array(i)
        i += 1
        k += 1
      } else{
        temp(k) = array(j)
        j += 1
        k += 1
      }
    }
    while (i <= mid) {temp(k) = array(i);i += 1;k += 1}
    while (j <= high) {temp(k) = array(j);j += 1;k += 1}
    i = low
    for(index <- 0 until k){
      array(i) = temp(index)
      i += 1
    }
  }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值