1. 程式人生 > >快速排序遞迴實現

快速排序遞迴實現

分析:快速排序的原理就是遞迴+分治法,分治法是講每次選擇基準,講所有元素按基準左右按大小站隊,它是不穩定的,因為這是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); 分治法的引數要和原問題的引數對應。