1. 程式人生 > >快速排序的時間複雜度和空間複雜度

快速排序的時間複雜度和空間複雜度

最近沒有寫快速排序演算法,就轉了一下這個程式碼
快速排序演算法在陣列中選擇一個稱為主元(pivot)的元素,將陣列分為兩部分,使得 第一部分中的所有元素都小於或等於主元,而第二部分的所有元素都大於主元。對第一部分遞迴地應用快速排序演算法,然後對第二部分遞迴地應用快速排序演算法。
在最差情況下,劃分由 n 個元素構成的陣列需要進行 n 次比較和 n 次移動。因此劃分所需時間為 O(n) 。最差情況下,每次主元會將陣列劃分為一個大的子陣列和一個空陣列。這個大的子陣列的規模是在上次劃分的子陣列的規模減 1 。該演算法需要 (n-1)+(n-2)+…+2+1= O(n^2) 時間。
在最佳情況下

,每次主元將陣列劃分為規模大致相等的兩部分。設 T(n) 表示使用快速排序演算法對包含 n 個元素的陣列排序所需的時間,因此,和歸併排序的分析相似,快速排序的 T(n)= O(nlogn)。

import java.awt.List;
/**
 * Created by shuxing on 2017/7/12.
 */
public class QuickSort {
    public static int[] quickSort(int[] list) {
        quickSort(list, 0, list.length - 1);
        return list;
    }

    public
static int[] quickSort(int[] list, int first, int last) { if (first < last) {//遞迴地對主元(pivot)前後的陣列進行快排 int pivotIndex = partition(list, first, last); quickSort(list, first, pivotIndex - 1); quickSort(list, pivotIndex + 1, last); } return list
; } public static int partition(int[] list, int first, int last) {//操作過程見下圖 int pivot = list[first], low = first + 1, high = last; //尋找前半陣列中大於主元的元素下標和後半陣列中小於或等於主元的元素下標 while (high > low) { while (pivot >= list[low] && low <= high) low++; while (pivot < list[high] && low <= high) high--; //交換兩個元素 if (low < high) { int tmp = list[low]; list[low] = list[high]; list[high] = tmp; } } //插入主元進適當位置 while (list[high] >= pivot && high > first) high--; if (list[high] < pivot) { list[first] = list[high]; list[high] = pivot; return high; } else { return first; } } public static void main(String[] args) { int[] list = {2,6,3,5,4,1,8,45,2}; list = quickSort(list); for (int i = 0; i < list.length; i++) { System.out.println(list[i]); } } }