1. 程式人生 > 其它 >快排演算法

快排演算法

快排演算法的思想是基於分治的,首先定義一個基準值,將待排序陣列分成兩塊。前一塊是比基準值小的,後一塊是比基準值大的。將這個基準值排序到它應該的位置的時候,這個時候基準值的位置已經確定了,之後就採用遞迴的方式分別對基準值前後兩塊待排序的子陣列進行相同方法的排序。

public void quickSort(int[] nums,int low,int high){
        if(low>=high){
            return;
        }
        int middle=findmiddle(nums,low,high);
        quickSort(nums,low,middle-1);
        quickSort(nums,middle+1,high);

    }
    public int findmiddle(int[] nums,int low,int high){
        int flag=nums[low];
        while(low<high){
            while(low<high && nums[high]>flag){
                high--;
            }
            //因為這裡的num[low]已經被儲存至flag當中,所以不用擔心num[low]的值丟失,直接進行覆蓋即可
            nums[low]=nums[high];
            while(low<high && nums[low]<=flag){
                low++;
            }
            //同理,high的值在發現有存在比flag小的值之後,就沒有再進行變化了。
            //這裡nums[high]的值已經複製給了num[low],所以當前帶排序陣列中存在兩個與num[high]相等的值
            //因此可以直接對這個被拋棄的nums[high]覆蓋。
            nums[high]=nums[low];
        }
        //此時low與high相遇,說明第一次排序完畢,基準值到了正確的位置。
        nums[low]=flag;
        return low;

    }

測試函式

public class Main {
    public static void main(String[] args) {
        Solution solution=new Solution();
        Scanner in=new Scanner(System.in);
        String[] strnums=null;
        strnums=in.nextLine().split(" ");
        int length=strnums.length;
        int[] nums=new int[length];
        for(int i=0;i<length;i++){
            nums[i]=Integer.valueOf(strnums[i]);
        }
        solution.quickSort(nums,0,nums.length-1);
        for(int i=0;i<nums.length;i++){
            System.out.print(nums[i]+" ");
        }

    }
}