Scala编写冒泡,排序,二分法

**
  * 常见的查找算法
  * 1. 冒泡法
  * 2. 排序法
  * 3. 二分法
  */
object FindArithmetic {

  /**
    * 冒泡法
    *
    * @param str
    * @return
    * 给你 n 个数 ,我们用第一个数和第二个数进行比较 ,大的那个就放第二位 ,
    * 然后第二位和第三位比较 ,大的那个放在第三位 ,依次比下去 ,
    * 待到和最后一个比较结束 ,我们就能得到这 n 个数中最大的那个 ,且放在最后一个位置上 。
    */
  def maoPao(arr: Array[Int]): Array[Int] = {
    for (i <- 0 until arr.length) {
      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
        }
      }
    }
    arr
  }

  /**
    * 快速排序
    *
    * @param arr
    * @return
    * 快速排序 ,快速排序是对冒泡排序的一种改进 。
    * 它的基本思想是将要排序的数据分割成独立的两部分 ,
    * 其中一部分的所有数据都比另外一部分的所有数据都要小 。
    * 然后在按照此方法对两部分数据分别进行快速排序 ,
    * 最终得到一个有序的序列 。
    */
  def paixu(arr: Array[Int]): Array[Int] = {
    for (i <- 0 until arr.length) {
      //第一次排序
      var k = i
      for (j <- k + 1 until arr.length) {
        //第二次排序
        if (arr(k) > arr(j)) {
          //前面一个大于后面一个 记下目前找到的最大值所在的位置
          k = j
        }
      }
      if (i != k) {
        val tmp = arr(i)
        arr(i) = arr(k)
        arr(k) = tmp
      }
    }
    arr
  }

  /**
    * 二分法查找
    * 一个数组,输入一个数字,查找该数字在数组中的下标。 如果找不到,返回-1
    *
    * @param arr
    * @param z
    * @return
    */
  def erfenFind(arr: Array[Int], num: Int): Int = {
    var start = 0; // 默认起始坐标
    var end = arr.length - 1; // 默认结尾坐标
    var index = -1; // 找不到默认index为-1
    while (start <= end) {
      val middle = (start + end) / 2; // 计算中间下标
      if(num == arr(middle)){
        index = middle
        return index
      }
      if(num > arr(middle)){
        start = middle + 1
      }

      if(num < arr(middle)){
        end = middle - 1
      }
    }
    index
  }

  def main(args: Array[String]): Unit = {
    val arr = Array(1, 4, 5, 2, 3, 6, 1, 2, 44, 62, 3, 12, 312, 313, 3)
    println(maoPao(arr).toBuffer)
    println(paixu(arr).toBuffer)
    println(erfenFind(arr,44))
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值