快速排序遞迴實現
阿新 • • 發佈:2018-12-12
分析:快速排序的原理就是遞迴+分治法,分治法是講每次選擇基準,講所有元素按基準左右按大小站隊,它是不穩定的,因為這是partition過程導致的,假設元素a和基準a重複,但是不能保判斷條件<=a時候從後面的元素移動到基準左邊。舉例如下: 3 1 2 8 3 從右向左找<= 3的數,就是尾數3,它必然會移動到基準3之前,而且最後基準3是要和while條件推出的i下標元素互換,所以一定是相同元素位置變動了。 程式碼:
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] a = {1, 2, 4, 5, 7, 4, 5, 3, 9, 0}; quickSort(a, 0, a.length - 1); System.out.println(Arrays.toString(a)); } private static void quickSort(int[] a, int low, int high) { if(low > high) return; int i = low; int j = high; int key = a[low]; while (i < j) { while (i < j && a[j] > key) j--; while (i < j && a[i] <= key) i++; if (i < j) { int p = a[i]; a[i] = a[j]; a[j] = p; } } int temp = a[i]; a[i] = a[low]; a[low] = temp; quickSort(a, low, i - 1); quickSort(a, i + 1, high); } }
其實還是遞迴的基礎,記得當時資料結構課上,老師只會講怎麼劃分,對遞迴隻字不提,如果資料結構和演算法思想不結合起來,有什麼意義呢,另外一點是關於變數為什麼要儲存: int i = low; int j = high; 一個是在基準與i下標元素交換時候得是最開始遞迴那一層的基準,所以需要記憶,另外一作用是: quickSort(a, low, i - 1); quickSort(a, i + 1, high); 分治法的引數要和原問題的引數對應。