排序算法之快速排序(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))
}
}
}
}