(2)快速排序 (Quick Sort)

2021-01-09 14:29 更新

快速排序的基本思想:通過一趟排序?qū)⒋庞涗浄指舫瑟毩⒌膬刹糠郑渲幸徊糠钟涗浀年P(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序。

算法描述快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體算法描述如下:

  • 從數(shù)列中挑出一個元素,稱為 “基準(zhǔn)”(pivot);
  • 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個稱為分區(qū)(partition)操作;
  • 遞歸地把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

動圖演示

20201231230707237

代碼實現(xiàn)

class Solution:
    def partition(self, nums, begin, end):
        pivot, counter = end, begin
        # counter 記錄小于pivot的位置和個數(shù)
        for i in range(begin, end):
            if nums[i] < nums[pivot]:
                counter += 1
            if counter != i:
                temp = nums[counter]
                nums[counter] = nums[i]
                nums[i] = temp

        temp = nums[pivot]
        nums[pivot] = nums[counter]
        nums[counter] = temp
        return counter

    def quicksort(self, nums, begin, end):
        if end <= begin: return
        pivot = self.partition(nums, begin, end)
        self.quicksort(nums, begin, pivot - 1)
        self.quicksort(nums, pivot + 1, end)

    def sortArray(self, nums: List[int]) -> List[int]:
        self.quicksort(nums, 0, len(nums) - 1)
        return nums

算法特性
  • 時間復(fù)雜度(最好):O ( n l o g n ) O(nlog n)O(nlogn)
  • 時間復(fù)雜度(最壞):O ( n 2 ) O(n^2)O(n2)
  • 時間復(fù)雜度(平均):O ( n l o g n ) O(nlog n)O(nlogn)
  • 空間復(fù)雜度:O ( n l o g n ) O(nlog n)O(nlogn)
  • 穩(wěn)定性:不穩(wěn)定

算法原理

快速排序是圖靈獎得主 C. R. A. Hoare 于 1960 年提出的一種劃分交換排序。它采用了一種分治的策略,通常稱其為分治法(Divide-and-ConquerMethod)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號