java實現快速排序

DrXin發表於2019-01-19

圖片描述

以上為思路。
總的來說,快速排序也是利用了分治法的思想。
基本步驟:1.先選擇好合適的主元pivot,
2.然後再把比主元小的元素放到主元的左邊(右邊),把較大的元素放到主元的右邊(左邊),
3.接著再以主元為分界點,把陣列分為兩個部分,再分別對兩邊的陣列重複第二步的操作,
4.最後便實現了有序排列。

快速排序的時間複雜度為O(NlgN),這是一種不穩定的排序方法。

以下程式碼實現

public static void quickSort(int arr[], int left, int right) {
        int index = partition(arr, left, right);
        
        if (left < index - 1)
            quickSort(arr, left, index - 1);
    
        if (index < right)
            quickSort(arr, index, right);
    }
    //以二分法的思路對陣列分組
    private static int partition(int arr[], int left, int right){
        int i = left, j = right;
        int tmp;
        //以最左邊、最右邊、中間三個數的中位數為主元
        int pivot = findPivot(arr, left, (left+right)>>1, right);
  
        while (i <= j) {
      
            while (arr[i] < pivot)
                i++;

            while (arr[j] > pivot)
                j--;

            if (i <= j) {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                i++;
                j--;
            }
        }
  
        return i;
    }
    //確定主元
    private static int findPivot(int[] nums, int left, int mid, int right){
        if(nums[left] > nums[right]) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
        }
        
        if(nums[left] > nums[mid]) {
            int temp = nums[left];
            nums[left] = nums[mid];
            nums[mid] = temp;
        }
        
        if(nums[mid] > nums[right]) {
            int temp = nums[right];
            nums[right] = nums[mid];
            nums[mid] = temp;
        }
        return  nums[mid];
    }

相關文章