Python實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之快速排序詳解
本文實例講述了Python實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之快速排序。分享給大家供大家參考。具體分析如下:
一、概述
快速排序(quick sort)是一種分治排序算法。該算法首先 選取 一個劃分元素(partition element,有時又稱為pivot);接著重排列表將其 劃分 為三個部分:left(小于劃分元素pivot的部分)、劃分元素pivot、right(大于劃分元素pivot的部分),此時,劃分元素pivot已經(jīng)在列表的最終位置上;然后分別對left和right兩個部分進行 遞歸排序。
其中,劃分元素的 選取 直接影響到快速排序算法的效率,通常選擇列表的第一個元素或者中間元素或者最后一個元素作為劃分元素,當然也有更復雜的選擇方式;劃分 過程根據(jù)劃分元素重排列表,是快速排序算法的關(guān)鍵所在,該過程的原理示意圖如下:
<-- 選取劃分元素 -->
<-- 劃分過程 -->
<-- 劃分結(jié)果 -->
快速排序算法的優(yōu)點是:原位排序(只使用很小的輔助棧),平均情況下的時間復雜度為 O(n log n)。快速排序算法的缺點是:它是不穩(wěn)定的排序算法,最壞情況下的時間復雜度為 O(n2)。
二、Python實現(xiàn)
1、標準實現(xiàn)
#!/usr/bin/env python # -*- coding: utf-8 -*- def stdQuicksort(L): qsort(L, 0, len(L) - 1) def qsort(L, first, last): if first < last: split = partition(L, first, last) qsort(L, first, split - 1) qsort(L, split + 1, last) def partition(L, first, last): # 選取列表中的第一個元素作為劃分元素 pivot = L[first] leftmark = first + 1 rightmark = last while True: while L[leftmark] <= pivot: # 如果列表中存在與劃分元素pivot相等的元素,讓它位于left部分 # 以下檢測用于劃分元素pivot是列表中的最大元素時, #防止leftmark越界 if leftmark == rightmark: break leftmark += 1 while L[rightmark] > pivot: # 這里不需要檢測,劃分元素pivot是列表中的最小元素時, # rightmark會自動停在first處 rightmark -= 1 if leftmark < rightmark: # 此時,leftmark處的元素大于pivot, #而rightmark處的元素小于等于pivot,交換二者 L[leftmark], L[rightmark] = L[rightmark], L[leftmark] else: break # 交換first處的劃分元素與rightmark處的元素 L[first], L[rightmark] = L[rightmark], L[first] # 返回劃分元素pivot的最終位置 return rightmark
2、Pythonic實現(xiàn)
#!/usr/bin/env python # -*- coding: utf-8 -*- def pycQuicksort(L): if len(L) <= 1: return L return pycQuicksort([x for x in L if x < L[0]]) + \ [x for x in L if x == L[0]] + \ pycQuicksort([x for x in L if x > L[0]])
對比 標準實現(xiàn) 可以看出,Pythonic實現(xiàn) 更簡潔、更直觀、更酷。但需要指出的是,Pythonic實現(xiàn) 使用了Python中的 列表解析 (List Comprehension,也叫列表展開、列表推導),每一次 遞歸排序 都會產(chǎn)生新的列表,因此失去了快速排序算法本來的 原位排序 的優(yōu)點。
三、算法測試
#!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': L = [54, 26, 93, 17, 77, 31, 44, 55, 20] M = L[:] print('before stdQuicksort: ' + str(L)) stdQuicksort(L) print('after stdQuicksort: ' + str(L)) print('before pycQuicksort: ' + str(M)) print('after pycQuicksort: ' + str(pycQuicksort(M)))
運行結(jié)果:
$ python testquicksort.py before stdQuicksort: [54, 26, 93, 17, 77, 31, 44, 55, 20] after stdQuicksort: [17, 20, 26, 31, 44, 54, 55, 77, 93] before pycQuicksort: [54, 26, 93, 17, 77, 31, 44, 55, 20] after pycQuicksort: [17, 20, 26, 31, 44, 54, 55, 77, 93]
希望本文所述對大家的Python程序設(shè)計有所幫助。
相關(guān)文章
Python中的錯誤和異常處理簡單操作示例【try-except用法】
這篇文章主要介紹了Python中的錯誤和異常處理簡單操作,結(jié)合實例形式分析了Python中try except在錯誤與異常處理中的用法,需要的朋友可以參考下2017-07-07基于Python實現(xiàn)文章信息統(tǒng)計的小工具
及時的統(tǒng)計可以更好的去分析讀者對于內(nèi)容的需求,了解文章內(nèi)容的價值,以及從側(cè)面認識自己在知識創(chuàng)作方面的能力。本文就來用Python制作一個文章信息統(tǒng)計的小工具?,希望對大家有所幫助2023-02-02python爬蟲數(shù)據(jù)保存到mongoDB的實例方法
在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲數(shù)據(jù)保存到mongoDB的實例方法,有需要的朋友們可以參考下。2020-07-07pyqt4教程之實現(xiàn)windows窗口小示例分享
這篇文章主要介紹了pyqt4實現(xiàn)windows窗口小示例,需要的朋友可以參考下2014-03-03Python中實現(xiàn)結(jié)構(gòu)相似的函數(shù)調(diào)用方法
這篇文章主要介紹了Python中實現(xiàn)結(jié)構(gòu)相似的函數(shù)調(diào)用方法,本文講解使用dict和lambda結(jié)合實現(xiàn)結(jié)構(gòu)相似的函數(shù)調(diào)用,給出了不帶參數(shù)和帶參數(shù)的實例,需要的朋友可以參考下2015-03-03淺談Python類里的__init__方法函數(shù),Python類的構(gòu)造函數(shù)
下面小編就為大家?guī)硪黄獪\談Python類里的__init__方法函數(shù),Python類的構(gòu)造函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12Python flashtext文本搜索和替換操作庫功能使用探索
本文將深入介紹Python flashtext庫,包括其基本用法、功能特性、示例代碼以及實際應用場景,以幫助大家更好地利用這個有用的工具2024-01-01Django?+?Taro?前后端分離項目實現(xiàn)企業(yè)微信登錄功能
這篇文章主要介紹了Django?+?Taro?前后端分離項目實現(xiàn)企業(yè)微信登錄功能,本文記錄一下企業(yè)微信登錄的流程,結(jié)合示例代碼給大家分享實現(xiàn)思路,需要的朋友可以參考下2022-04-04Python實現(xiàn)定時自動關(guān)閉的tkinter窗口方法
今天小編就為大家分享一篇Python實現(xiàn)定時自動關(guān)閉的tkinter窗口方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python利用代理ip實現(xiàn)自動化爬蟲任務(wù)管理
本文主要介紹了Python利用代理ip實現(xiàn)自動化爬蟲任務(wù)管理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06