LeetCode:快速排序

菜鳥Octopus發表於2018-08-20

快速排序(Quicksort)是對氣泡排序的一種改進。

     它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列

     設要排序的陣列是A[0]……A[N-1],首先任意選取一個資料(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。

第一種實現: 


package Sort;

import java.util.Arrays;

/**
*類描述:二分查詢的精髓在於控制迴圈的次數,進行遍歷
*@author: 張宇
*@date: 日期: 2018年8月20日 時間: 上午10:31:45
*@version 1.0
 */

public class QuickSort {
	public static void main(String []args){
        int[] arrs = {12,20,5,16,15,1,30,45,23,9};       
        quickSort(arrs,0,arrs.length-1);
        System.out.println(Arrays.toString(arrs));
     } 
	 //快速排序,遞迴演算法
     private static void quickSort(int[] arr, int low, int high) {
        int start = low;
        int end = high;
        int key = arr[start];
        while (start < end) {
            // 要從尾到前面進行比較
            while (start < end && arr[end] >= key) {
                end--;
            }
            if (arr[end] <= key) {
                int temp = arr[end];
                arr[end] = arr[start];
                arr[start] = temp;
            }
            // 要從前到後進行比較
            while (start < end && arr[start] <= key) {
                start++;
            }
            if (arr[start] >= key) {
                int temp = arr[start];
                arr[start] = arr[end];
                arr[end] = temp;
            }
        }
        if (start > low) {
            quickSort(arr, low, start - 1);
        }
        if (end < high) {
            quickSort(arr, end + 1, high);
        }
    }
}

時間複雜度:O(n*logn)

空間複雜度:O(n)


第二種實現:

 // 快速排序的設計思路2
    private void quickSort2(int[] arr, int low, int high) {
        int start = low;
        int end = high;
        int key = arr[start];
        while (start != end) {
            while (start < end && key <= arr[end]) {
                end--;
            }
            while (start < end && key >= arr[start]) {
                start++;
            }
            if (start != end)
                swap(arr, start, end);
        }
        swap(arr, start, low);
        if (start > low) {
            quickSort2(arr, low, start - 1);
        }
        if (end < high) {
            quickSort2(arr, end + 1, high);
        }
    }

時間複雜度:O(n*logn)

空間複雜度:O(n)


原始碼github地址:https://github.com/zhangyu345293721/leetcode

相關文章