Python排序算法實例代碼
排序算法,下面算法均是使用Python實現(xiàn):
插入排序
原理:循環(huán)一次就移動一次元素到數(shù)組中正確的位置,通常使用在長度較小的數(shù)組的情況以及作為其它復(fù)雜排序算法的一部分,比如mergesort或quicksort。時間復(fù)雜度為 O(n2) 。
# 1nd: 兩兩交換
def insertion_sort(arr):
for i in range(1, len(arr)):
j = i
while j >= 0 and arr[j-1] > arr[j]:
arr[j], arr[j-1] = arr[j-1], arr[j]
j -= 1
return arr
# 2nd: 交換,最后處理沒交換的
def insertion_sort2(arr):
for i in range(1, len(arr)):
j = i-1
key = arr[i]
while j >= 0 and arr[j] > key:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
return arr
# 3nd: 加速版本,利用已經(jīng)排好了序的進行二分查找
def insertion_sort3(seq):
for i in range(1, len(seq)):
key = seq[i]
# invariant: ``seq[:i]`` is sorted
# find the least `low' such that ``seq[low]`` is not less then `key'.
# Binary search in sorted sequence ``seq[low:up]``:
low, up = 0, i
while up > low:
middle = (low + up) // 2
if seq[middle] < key:
low = middle + 1
else:
up = middle
# insert key at position ``low``
seq[:] = seq[:low] + [key] + seq[low:i] + seq[i + 1:]
return seq
# 4nd: 原理同上,使用bisect
import bisect
def insertion_sort4(seq):
for i in range(1, len(seq)):
bisect.insort(seq, seq.pop(i), 0, i) # 默認(rèn)插在相同元素的左邊
return seq
選擇排序
原理:每一趟都選擇最小的值和當(dāng)前下標(biāo)的值進行交換,適用在大型的數(shù)組,時間復(fù)雜度為 O(n2)
# 1nd: for
def select_sort(seq):
for i in range(0, len(seq)):
mi = i
for j in range(i, len(seq)):
if seq[j] < seq[mi]:
mi = j
seq[mi], seq[i] = seq[i], seq[mi]
return seq
# 2nd: min
def select_sort2(seq):
for i, x in enumerate(seq):
mi = min(range(i, len(seq)), key=seq.__getitem__)
seq[i], seq[mi] = seq[mi], x
return seq
冒泡排序
原理:比較數(shù)組中兩兩相鄰的數(shù),如果第一個大于第二個,就進行交換,重復(fù)地走訪過要排序的數(shù)列,達到將最小的值移動到最上面的目的,適用于小型數(shù)組,時間復(fù)雜度為O(n2)
def bubble_sort(seq):
for i in range(len(seq)):
for j in range(len(seq)-1-i):
if seq[j] > seq[j+1]:
seq[j], seq[j+1] = seq[j+1], seq[j]
return seq
def bubble_sort2(seq):
for i in range(0, len(seq)):
for j in range(i + 1, len(seq)):
if seq[i] > seq[j]:
seq[i], seq[j] = seq[j], seq[i]
return seq
快速排序
原理:從數(shù)組中選擇pivot,分成兩個數(shù)組,一個是比pivot小,一個是比pivot大,最后將這兩個數(shù)組和pivot進行合并,最好情況下時間復(fù)雜度為O(n log n),最差情況下時間復(fù)雜度為O(n2)
def quick_sort(seq):
if len(seq) >= 1:
pivot_idx = len(seq)//2
small, large = [], []
for i, val in enumerate(seq):
if i != pivot_idx:
if val <= seq[pivot_idx]:
small.append(val)
else:
large.append(val)
quick_sort(small)
quick_sort(large)
return small + [seq[pivot_idx]] + large
else:
return seq
歸并排序
原理:歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。
# 1nd: 將兩個有序數(shù)組合并到一個數(shù)組 def merge(left, right): i, j = 0, 0 result = [] while i < len(left) and j < len(right): if left[i] <= right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result += left[i:] result += right[j:] return result def merge_sort(lists): if len(lists) <= 1: return lists num = len(lists) / 2 left = merge_sort(lists[:num]) right = merge_sort(lists[num:]) return merge(left, right) # 2nd: use merge from heapq import merge def merge_sort2(m): if len(m) <= 1: return m middle = len(m) // 2 left = m[:middle] right = m[middle:] left = merge_sort(left) right = merge_sort(right) return list(merge(left, right))
堆排序
原理:堆排序(Heapsort)是指利用堆積樹(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法,它是選擇排序的一種??梢岳脭?shù)組的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節(jié)點的值都不大于其父節(jié)點的值,即A[PARENT[i]] >= A[i]。在數(shù)組的非降序排序中,需要使用的就是大根堆,因為根據(jù)大根堆的要求可知,最大的值一定在堆頂。平均時間復(fù)雜度為O(n logn)
# 1nd: normal def swap(seq, i, j): seq[i], seq[j] = seq[j], seq[i] # 調(diào)整堆 def heapify(seq, end, i): l = 2 * i + 1 r = 2 * (i + 1) ma = i if l < end and seq[i] < seq[l]: ma = l if r < end and seq[ma] < seq[r]: ma = r if ma != i: swap(seq, i, ma) heapify(seq, end, ma) def heap_sort(seq): end = len(seq) start = end // 2 - 1 # 創(chuàng)建堆 for i in range(start, -1, -1): heapify(seq, end, i) for i in range(end - 1, 0, -1): swap(seq, i, 0) heapify(seq, i, 0) return seq # 2nd: use heapq import heapq def heap_sort2(seq): """ Implementation of heap sort """ heapq.heapify(seq) return [heapq.heappop(seq) for _ in range(len(seq))]
希爾排序
原理:希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩(wěn)定排序算法。希爾排序是把記錄按下標(biāo)的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關(guān)鍵詞越來越多,當(dāng)增量減至1時,整個文件恰被分成一組,算法便終止。
def shell_sort(seq): count = len(seq) step = 2 group = count // step while group > 0: for i in range(0, group): j = i + group while j < count: k = j - group key = seq[j] while k >= 0: if seq[k] > key: seq[k + group] = seq[k] seq[k] = key k -= group j += group group //= step return seq
區(qū)別

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python協(xié)程異步爬取數(shù)據(jù)(asyncio+aiohttp)實例
這篇文章主要為大家介紹了Python協(xié)程異步爬取數(shù)據(jù)(asyncio+aiohttp)實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
Python模塊結(jié)構(gòu)與布局操作方法實例分析
這篇文章主要介紹了Python模塊結(jié)構(gòu)與布局操作方法,結(jié)合實例形式分析了Python模塊與布局的相關(guān)概念、使用方法與相關(guān)注意事項,需要的朋友可以參考下2017-07-07
Python之根據(jù)輸入?yún)?shù)計算結(jié)果案例講解
這篇文章主要介紹了Python之根據(jù)輸入?yún)?shù)計算結(jié)果案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Python+Selenium+phantomjs實現(xiàn)網(wǎng)頁模擬登錄和截圖功能(windows環(huán)境)
Python是一種跨平臺的計算機程序設(shè)計語言,它可以運行在Windows、Mac和各種Linux/Unix系統(tǒng)上。這篇文章主要介紹了Python+Selenium+phantomjs實現(xiàn)網(wǎng)頁模擬登錄和截圖功能,需要的朋友可以參考下2019-12-12
Python實戰(zhàn)之ATM取款機的實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用Python語言模擬實現(xiàn)ATM取款機功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-09-09

