排序算法之快速排序(java+Scala)

排序算法之快速排序(java+Scala)

简述
快速排序是一种执行效率很高的排序算法,利用分治的思想,设置一个基准数,将所有比基准数小的放在标识数的左边,比基准数大的放在基准的右边,通过递归,将整个数组排序。

//java代码
public class QuickSort {
    public static void quickSort(int[] arr,int left, int right){
         if (left>right){
             return;
         }
         int l = left;
         int r = right;
         //设置基准数为数组下标为left的数字
         int key=arr[left];
         //定义变量,用于两个数字的对调
         int temp;
         while (l<r){
             //从右边开始找比基准数小的数字
             //这里不能缺少l<r的条件,如果缺少会报错
             //因为虽然第一个循环l<r成立,但是在第二个循环中,最后l不一定小于r
             while (arr[r]>=key && l<r){
                 r--;
             }
             //从左边开始找比基准数大的数字
             //这里不能缺少l<r的条件,如果缺少会报错
             while (arr[l]<=key && l<r){
                 l++;
             }
             //找到对应的数字后,交换两个数字的位置
             temp=arr[l];
             arr[l]=arr[r];
             arr[r]=temp;
         }
        System.out.println("********");
        for (int  i = 0;  i < arr.length;  i++) {
            System.out.printf(" "+arr[i]);
        }
        System.out.println("l="+l+"r="+r);
        // 将基准数放到中间的位置(基准数归位)
         arr[left]=arr[l];
         arr[l]=key;
        //递归,继续向基准的左右两边执行和上面同样的操作
         quickSort(arr,left,r-1);
         quickSort(arr,r+1,arr.length-1);
    }
    public static void main(String[] args) {
        int[] arr = {10,4,2,1,8,9,19};
        quickSort(arr,0,arr.length-1);
        System.out.println("排序结果是:");
        for (int  i = 0;  i < arr.length;  i++) {
            System.out.printf(" "+arr[i]);
        }
    }
}
//scala代码
/**
 * 快速排序
 *      9,8,7,1,2,3,4,5,6
 * 折半进行排序,每次都是基于一个基准元素mark进行比较,
 * 把小于基准元素mark的放置到左侧,大于mark放置到右侧。
 * 通过这一次转换,我们就能够找到mark在本集合中的恰当的位置。
 *
 */
object QuickSort02_02 {
  def main(args: Array[String]): Unit = {

    val arr = List(9,8,7,1,2,3,4,5,6)
    println("排序前的数组:" + arr.mkString("[", ", ", "]"))
    val ret = quickSort(arr)
    println("排序后的数组结果:" + ret.mkString("[", ", ", "]"))

  }
  /**
   * 在scala的集合中有一个方法能够将集合分成两半,可以存储满足条件的数据
   * partition--->分区
   * 注:val (a,b) = List(1,2,3,4,5).partition(_%2==0) // (List(2,4), List(1,3,5))
   * 可把Collection分成:满足条件的一组,其他的另一组。
   * 一般的基准元素就是每次进行排序的第一个元素。
   *
   */
  def   quickSort(arr: List[Int]):List[Int]  ={
    arr match {
      case Nil => Nil
      case List() => List()
      case _ => {
        val (smaller,larger)= arr.tail.partition(num => num < arr.head)
        quickSort(smaller) ::: (arr.head :: quickSort(larger))
      }
    }
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值