Python實現的快速排序

2022-01-06 楊建榮的學習筆記

今天看了下《算法新解》這本書,很薄的一本書,最開始吸引我的有兩點,一個是裡面的大量的圖,內容相對來說比較清新,第二個是裡面的代碼是基於Python實現。儘管算法和語言的關聯實現差別不是很大,重在思想,我是希望直接一些,能看到最直接的就懶得轉換了。

看這本書的時候有幾個瞬間突然有頓悟的感覺。

第一個是一般的翻譯書的內容背景很難轉換,老外舉的例子我們很多時候沒有代入感。在這裡我找到了一些共同的語言,作者看起來是在矽谷工作,舉的一個旅行家問題是以舊金山,帕羅奧圖,伯克利來說明,一看到這個例子,我就能很快想起之前去那邊的行程安排,地圖我已經研究得很熟了,所以再看到這個例子完全不會陌生,還多了一些親切感。這可能就是一些額外的知識補充給帶給我的福利吧。

第二個是對於數據結構設計上和算法的密切相關,讓我突然理解了資料庫中的設計方式。如果說原來是明白了5分,現在是打通了原來的一道壁壘,我能夠真正的接受那種設計方式。

第三個是對於算法的設計,排除了我原來的一些盲點。大學看的算法書都很嚴謹,嚴謹到很多時候看不懂,越是關鍵的算法,覺得自己花費的腦細胞越多,但是感覺還是不得要領,今天在這裡找到了一些靈感,大概2個多小時的時間,竟然看完了1/3的內容。

算法是程式設計師的一大利器,做一件事情實現的方式有很多,但是如何平衡找到最合適的方法卻很難。記得大學看一個算法,花了好幾個小時,結果上課的時候,老師花了不到五分鐘就講完了,然後腦袋一片空白,記得當時學快速排序的時候,感覺這個算法應該是很複雜,感覺理解了,但是很快就忘記了。如果要落到紙面上完全不行。

第四個是對遞歸的理解。今天看了之後算是刷新自己的認知。裡面有句話說的好:遞歸將人分為三個截然不同的陣營,恨它的,愛它的,和恨了幾年又愛上它的。我確切的說也是屬於第三種。

使用循環,程序的性能可能而更好,但是使用遞歸,程序更容易理解。

對於快速排序,算法的思考方式就是由簡到難。

如果是一個數,則返回,如果是兩個數,直接比較很快就能出結果,我們用僱一個通用思維來考慮,設定一個參考值,如果大於參考值,則在右側由數組存放,如果小於參考值,則在左側存放。這樣一來,三個數,四個數都是如此的思路。我們就可以使用遞歸來處理了。

能執行的程序很短,內容如下:

def quicksort(array):
if len(array) < 2:
return array
else:
pivot = array[0]
less = [i for i in array[1:] if i<= pivot]
greater = [i for i in array[1:] if i > pivot]
return quicksort(less) + [pivot] + quicksort(greater)

print quicksort([5,11,3,5,8,2,6,7])

如果給程序打上日誌,簡單補充幾個print來看看每個節點的執行情況:


def quicksort(array):
if len(array) < 2:
return array
else:
pivot = array[0]
print("pivot:",pivot)
less = [i for i in array[1:] if i<= pivot]
print("less:",less)
greater = [i for i in array[1:] if i > pivot]
print("greater",greater)
print("sum:",(less) + [pivot] + (greater))
return quicksort(less) + [pivot] + quicksort(greater)

print quicksort([5,11,3,5,8,2,6,7])

生成的日誌如下:


D:\programs\python2.7\python.exe C:/python/kmp/db_ops/quicksort.py
('pivot:', 5)
('less:', [3, 5, 2])
('greater', [11, 8, 6, 7])
('sum:', [3, 5, 2, 5, 11, 8, 6, 7])
('pivot:', 3)
('less:', [2])
('greater', [5])
('sum:', [2, 3, 5])
('pivot:', 11)
('less:', [8, 6, 7])
('greater', [])
('sum:', [8, 6, 7, 11])
('pivot:', 8)
('less:', [6, 7])
('greater', [])
('sum:', [6, 7, 8])
('pivot:', 6)
('less:', [])
('greater', [7])
('sum:', [6, 7])
[2, 3, 5, 5, 6, 7, 8, 11]

Process finished with exit code 0

對於分析問題還是大有幫助。程序本身不長,算是我見過最精煉的快排程序了。

相關焦點

  • 用python實現快速排序
    收錄於話題 #快速排序下面是快速排序的定義:快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
  • Python排序算法--快速排序
    在平均狀況下,排序 n 個項目要 Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 Ο(nlogn) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。我們可以從名字就可以看出快速排序存在的意義就在於:快,而且效率高,它是處理大數據最快的排序算法之一。
  • Python實現經典排序算法(四):快速排序
    快速排序(Quicksort)是對冒泡排序的一種改進。
  • Python 實現快速排序、冒泡排序和選擇排序
    作者|借我一生執拗https://www.jianshu.com/p/c150fd974ce8本節讓我們來介紹三種常用的排序算法
  • 用Python實現常見的四種排序算法
    排序是每個軟體工程師和開發人員都需要掌握的技能。不僅要通過編程面試,還要對程序本身有一個全面的理解。不同的排序算法很好地展示了算法設計上如何強烈的影響程序的複雜度、運行速度和效率。排序有很多種實現方法,比如冒泡排序、選擇排序、歸併排序、希爾排序、快速排序、插入排序、堆排序、基數排序等,今天就給大家介紹使用Python語言實現的其中4個排序算法。1. 快速排序首先要打亂序列順序 ,以防算法陷入最壞時間複雜度。快速排序使用「分而治之」的方法。
  • 用Python實現十大經典排序算法
    10種經典排序算法包括冒泡排序、選擇排序、快速排序、歸併排序、堆排序、插入排序、希爾排序、計數排序、桶排序、基數排序等。當然,還有一些其他的排序算法,大家可以繼續去研究下。:03快速排序快速排序(Quick Sort),是在上世紀60年代,由美國人東尼·霍爾提出的一種排序方法。
  • Python,Numpy,Pandas……數據科學家必備排序技巧
    python 3.6.8numpy 1.16.4pandas 0.24.2tensorflow==2.0.0-beta1#tensorflow-gpu==2.0.0-beta1 slows sortingpytorch 1.1讓我們從基礎開始吧!
  • Python版快速排序算法
  • 快速排序
    快速排序(Quicksort),一種排序算法,最早由東尼·霍爾提出。
  • JavaScript實現排序算法
    >希爾排序、快速排序;此處創建一個列表類ArrayList並添加一些屬性和方法,用於存放這些排序方法:1.冒泡排序冒泡排序的思路:希爾排序的實現思路:希爾排序主要通過對數據進行分組實現快速排序;根據設定的增量(gap)將數據分為gap個組(組數等於gap),再在每個分組中進行局部排序
  • 10 大經典排序算法(Python 版)
    排序算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸併排序、快速排序、堆排序、基數排序等。
  • 經典排序算法五 堆排序(JAVA實現)
    堆排序基本原理堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序。首先我們來了解下什麼是堆。堆分為兩種:大頂堆和小頂堆,兩者的差別主要在於排序方式。堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。
  • JavaScript算法之快速排序
    如果你在面試軟體工程師的職位,經常被問到的一個問題是快速排序是如何工作的。快速排序最簡單的邏輯步驟如下:選擇一個基準元素,把數組分為兩個子數組。重排數組以實現小於基準元素的元素被放置在基準的左側,大於基準元素的元素被放置在右側。對於左側和右側的元素重複步驟1和步驟2。也就是遞歸運行如上步驟,把更大的值和更小的值分割開來。
  • python快速求解不定積分和定積分
    sympy介紹sympy庫的安裝非常的簡單,利用conda命令可以快速的完成安裝。conda install sympy接下來,我們將介紹利用第三方庫sympy來完成積分的計算。python求解不定積分
  • python群聊工具實現(上)
    今天要實現的是一個群聊小程序,程序有一個服務端和一個客戶端,客戶端有一個下面如下:當用戶連接上伺服器後,伺服器就會給用戶發送恭喜你已經加入python學習群(後面還會實現在左側顯示用戶的名字),當還有其它用戶繼續加入時,會通知已經加入的用戶,說某個用戶加入python學習群,之後不管哪個用戶發送消息,大家的窗口中都會顯示出消息來
  • Python自動化辦公(內容)
    python自動化辦公(python操作Excel、Word、PDF、PPT)python使用openpyxl操作excel;python使用PyPDF2和pdfplumber操作pdf;python使用python-docx操作word;python使用python-pptx操作PPT;python如何自動收發郵件;python製作電話號碼歸屬地查詢工具;一:python
  • 音視頻開發之旅(24) 算法系列-快速排序
    @"fx(2)=6\r\n"因為下面要講的快速排序算法以及堆排序算法都會用到遞歸調用下面我們開始快速排序算法的學習。二、快速排序快速排序和冒泡排序一樣都屬於交換排序,不同在於,快速排序不是通過兩兩相鄰比較每一輪只把一個元素冒泡到頂端,而是引入了基準元素的概念,每一輪挑選一個基準元素(一般把第數組的第一個作為基準元素),讓比它大的元素移動到一端,比它小的元素移動到另外一端。然後在不斷的遞歸調用,從而實現快速排序。
  • python隊列、預設字典、排序字典
    python隊列、預設字典、排序字典import heapqclass PriorityQueue:
  • 快速介紹Python數據分析庫pandas的基礎知識和代碼示例
    「軟體工程師閱讀教科書作為參考時不會記住所有的東西,但是要知道如何快速查找重要的知識點。」為了能夠快速查找和使用功能,使我們在進行機器學習模型時能夠達到一定流程化。我創建了這個pandas函數的備忘單。這不是一個全面的列表,但包含了我在構建機器學習模型中最常用的函數。讓我們開始吧!
  • 使用python實現一個簡單計算器
    如果做一些簡單的界面,使用tkinter還是很方便的,畢竟是python自帶的庫。今天將會做下面這樣的一個計算器,可以實現基本的加減程序的運算,整體代碼邏輯比較簡單,主要是一個回調函數的理解。實現思路1.UI界面布局2.功能函數實現3.重構布局代碼4.按鈕回調函數綁定具體實現過程1.界面實現