算法思想:java
在 arr[left..right] 中任選一個元素做爲基準( pivot ), 下面代碼都以 arr 的第一個元素爲基準, 以此基準將當前 arr 劃分爲左、右兩個子區間 arr[left..pivotpos-1] 和 arr[pivotpos+1..right], 並使左子區間中全部元素均小於等於基準元素 pivot, 右子區間中全部元素均大於等於 pivot, 而基準元素pivot 則位於正確的位置( pivotpos )上,它無須參加後續的排序算法
分別對左子區間 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); // 對右子區間遞歸調用快速排序 }