Scala&Java實現快速排序

算法思想:java

  1. 在 arr[left..right] 中任選一個元素做爲基準( pivot ), 下面代碼都以 arr 的第一個元素爲基準, 以此基準將當前 arr 劃分爲左、右兩個子區間 arr[left..pivotpos-1] 和 arr[pivotpos+1..right], 並使左子區間中全部元素均小於等於基準元素 pivot, 右子區間中全部元素均大於等於 pivot, 而基準元素pivot 則位於正確的位置( pivotpos )上,它無須參加後續的排序算法

  2. 分別對左子區間 arr[left..pivotpos-1] 和右子區間 arr[pivotpos+1..right] 遞歸調用快速排序數組


Scala 代碼:優化

1. 以 arr 第一個元素爲基準( pivot )ui

def quickSort(arr: List[Int]): List[Int] = {
    if (arr.length < 2) arr    // 當前集合只有一個元素,則無需排序,直接返回
    else quickSort(arr.filter(_ < arr.head))  // 對左子區間遞歸調用快速排序
         ++ (arr.filter(_ == arr.head))    // 與基準元素相等, 無須參加後續的排序
         ++ quickSort(arr.filter(_ > arr.head))   // 對右子區間遞歸調用快速排序
}


2. 以 arr 中間那個元素爲基準( pivot )    優化spa

def quickSort(arr: List[Int]): List[Int] = {
	if(arr.length < 2) a    // 當前集合只有一個元素,則無需排序,直接返回
	else {
		val pivot = arr(arr.length / 2)    // 以中間元素爲基準( pivot )
		quickSort(arr.filter(_ < pivot))    // 對左子區間遞歸調用快速排序
		++ arr.filter(_ == pivot)    // 與基準元素相等, 無須參加後續的排序
		++ quickSort(arr.filter(_ > pivot))    // 對右子區間遞歸調用快速排序
	}
}



Scala 中:scala

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

Scala 版的快速排序算法, 將快速排序的算法思想展現得淋漓盡致, 固然在肯定基準元素位置上有一點點出入排序


Java 代碼:遞歸

private void quickSort(int left, int right) {
  if (left >= right) {    // 當前數組只有一個元素,則無需排序,直接返回
   return;
  }
  int temp = arr[left];    // 以第一個元素爲基準( pivot )
  int i = left;
  int j = right;
  while (i < j) {
   while (arr[j] >= temp && i < j) {    // 從後往前遍歷, 找出小於基準元素的下標
    j--;
   }
   while (arr[i] <= temp && i < j) {    // 從前日後遍歷, 找出大於基準元素的下標
    i++;
   }
   // 交換前面兩個下標的元素
   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);    // 對左子區間遞歸調用快速排序
  quickSort(i + 1, right);    // 對右子區間遞歸調用快速排序
}
相關文章
相關標籤/搜索