[JAVA]快速排序

VictorLeeLk發表於2017-09-23
package sort_book_datastruction;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 快速排序:
 * 基本思想:通過一趟排序將待排序列分割成兩部分,其中一部分記錄的關鍵字比另一部分記錄的關鍵字小,
 *        則可以分別對兩部分記錄繼續進行排序,以達到整個序列有序;
 *        每一趟能夠將樞軸元素放在正確的位置上。
 *具體做法:附設兩個指標low和high,他們的初值分別是low和high,設樞軸記錄的關鍵字為pivotkey,
 *       則首先從high所指的位置起向前搜尋找到第一個關鍵字小於pivotkey的記錄和樞軸互相交換,
 *       然後從low所指的位置起向後搜尋,找到第一個關鍵字大於pivotkey的記錄和樞軸互相交換,
 *       重複這兩步,直至low=high為止;
 *改進:每交換一對記錄需進行三次記錄賦值操作,而實際過程中對樞軸記錄的賦值是多餘的,因為只有一趟排序結束時,即
 *    low=high的位置才是樞軸記錄的最後位置。
 * @author Administrator
 *
 */
public class QuikSort {
//  public  void swap(int[] array,int low,int high){
//      int temp = array[low];
//      array[low] = array[ high];
//      array[high] =temp;
//  }   
    public  int getMiddle(int[] array,int low ,int high){
        if(array.length <=0)
            return -1;
        int pivotkey = array[low];//用子表的第一個記錄作為基準元素
        while(low<high){            //從表的兩端交替的向中間掃描
            while(low<high&&array[high]>=pivotkey)
                high--;
                //swap(array,low,high);
                array[low]=array[high];//改進的方法;將比樞軸記錄小的記錄移動到低端;
            while(low<high &&array[low]<=pivotkey)
                low++;
                //swap(array,low,high);
                array[high]=array[low];//將樞軸記錄大的記錄移動到高階;
        }
        array[low] = pivotkey;//樞軸記錄到位;
        return low;
    }
    public  void Qsort(int[] array,int low,int high){
        if(low<=high){//長度大於1
            int pivotloc = getMiddle(array,low,high);//將順序表array一分為2
            Qsort(array,low,pivotloc-1);//對低子表做遞迴排序
            Qsort(array,pivotloc+1,high);//對高子表做遞迴排序    
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        QuikSort qs = new QuikSort();
        int[] array = {49,38,65,97,76,13,27,49};
        qs.Qsort(array, 0, array.length-1);
        System.out.println("QUickSort:"+Arrays.toString(array));
    }
}

相關文章