Scala&Java实现快速排序

算法思想:

  1. 在arr[left..right]中任选一个元素作为基准(pivot),下面代码都以arr数组的第一个元素为基准(pivot),以此基准将当前无序区划分为左、右两个子区间arr[left..pivotpos-1)和arr[pivotpos+1..right],并使左边子区间中所有元素均小于等于基准元素pivot,右边的子区间中所有元素均大于等于pivot,而基准元素pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序

  2. 通过递归调用快速排序对左子区间arr[left..pivotpos-1]和右子区间arr[pivotpos+1..right]快速排序

Scala代码:

def quickSort(arr: List[Int]): List[Int] = {
    if (arr.length < 2) arr    //当前List集合只有一个元素,则无需排序,直接返回
    else quickSort(arr.filter(_ < arr.head))  //递归调用快速排序对左子区间arr[left..pivotpos-1]快速排序
         ++ (arr.filter(_ == arr.head))    //多个基准元素pivot则位于正确的位置,无须参加后续的排序
         ++ quickSort(arr.filter(_ > arr.head))//递归调用快速排序对右子区间arr[pivotpos+1..right]快速排序
}

Scala中:List集合的filter()方法:def filter(p: (A) => Boolean): List[A]

Scala版的快速排序,将快速排序的算法思想展示得淋漓尽致,仅仅只有两行代码,一个if,一个else,当然在确定基准元素位置上有一点点出入

Java代码:

private void quickSort(int left, int right) {
  if (left >= right) {    //当前数组只有一个元素,则无需排序,直接返回
   return;
  }
  int temp = arr[left];    //以arr数组的第一个元素为基准(pivot)
  int i = left;
  int j = right;
  while (i < j) {
   while (arr[j] >= temp && i < j) {    //从后往前遍历,如果元素小于基准元素,退出while循环
    j--;
   }
   while (arr[i] <= temp && i < j) {    //从前往后遍历,如果元素大于基准元素,退出while循环
    i++;
   }
   //交换前面两个while循环满足交换元素
   int t = arr[i];
   arr[i] = arr[j];
   arr[j] = t;
  }
  //交换基准元素arr[left]到基准位置i的元素,此时基准位置的左子区间都小于基准元素,基准位置的右子区间都大于基准元素
  arr[left] = arr[i];
  arr[i] = temp;
  quickSort(left, i - 1);    //递归调用快速排序对左子区间arr[left..pivotpos-1]快速排序
  quickSort(i + 1, right);    //递归调用快速排序对右子区间arr[pivotpos+1..right]快速排序
}

 

 

你可能感兴趣的:(java,scala,快速排序,Quicksort)