快速排序---遞歸(Java版)

package link.排序;/*
 *@author:
 *@time
 */

import java.util.Arrays;

public class QuickSort {
    /**
     * 從第一個數開始作標記數,依次從最後向前比較,如果第一個數比後面的大時,
     * 互換位置,如果第一個數換到後面,則遍歷從第二個數開始往後
     * 遍歷過程中有比後面一個大的,互換位置,然後從標記數換過來的位置-1向前遍歷,直到下標相同
     * 一輪結束後,標記數爲點,該點前面的一定比該數小,後面的一定比該數大
     * 然後按標記數的位置將數組分爲兩部分,繼續上面的排序,
     *
     * @param arr
     */
    public static void quickSort(int[] arr) {
        int begin = 0;
        int end = arr.length - 1;
        quickSort(arr, begin, end);

    }

    public static void quickSort(int[] arr, int begin, int end) {
        //每次進入遍歷時從最後一個開始向前遍歷
        boolean inBegin = true;
        int left = begin;
        int right = end;
        //標記標誌位
        int title=begin;
        if (begin >= end)
            return;
        while(left<right){
            if (inBegin == true) {
                while (arr[left] <= arr[right] && left < right) {
                    right--;
                }
                if (arr[left] > arr[right] && left < right) {
                    inBegin = (!inBegin);
                    swap(arr, left, right);
                    //轉移後標誌數的所在數組下標
                    title = right;
                }
            }
            if (inBegin == false) {
                while (arr[left] <= arr[right] && left < right) {
                    left++;
                }
                if (arr[left] > arr[right]) {
                    inBegin = (!inBegin);
                    swap(arr, left, right);
                    //轉移後標誌數的所在數組下標
                    title = left;
                }

            }
        }
        quickSort(arr, begin, title );
        quickSort(arr, title + 1, end);
    }

    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    //測試
    public static void main(String[] args) {
        int[] a = {15,56,1, 21, 5,16,2,69,5,498,6,1515,45,561,23,16,65,21,2};
        quickSort(a);
        System.out.println(Arrays.toString(a));
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章