資料結構與演算法(十一) 歸併排序 快速排序

2021-10-06 01:39:10 字數 1289 閱讀 8159

演算法基本思想:

歸併排序:

def mergesort(l):

""" 歸併排序

l: 待排序列表;

"""_mergesort_c(l,0,len(l)-1)

def _mergesort_c(l,p,r):

"""p: 起始下標;

r: 結束下標;

"""if p>=r:

return

q = (p+r)//2

_mergesort_c(l, p, q)

_mergesort_c(l, q+1, r)

_merge(l, p, q, r)

def _merge(l,p,q,r):

""""""

i,j = p,q+1

tmp =

while i<=q and j<=r:

if l[i] <= l[j]:

i += 1

else:

j += 1

if r-j > q-i:

start, end = j, r

else:

start, end = i, q

tmp.extend(l[start:end + 1])

l[p:r+1] = tmp

快速排序:

def quicksort(l):

""" 快速排序

l: 待排序列表;

n: 列表長度;

"""_quicksort_c(l, 0, len(l)-1)

def _quicksort_c(l, p, r):

if p >= r:

return

q = _partition(l, p, r)

_quicksort_c(l, p, q-1)

_quicksort_c(l, q+1, r)

def _partition(l, p , r):

pivot = l[r]

i = p

for j in range(p,r):

if l[j] <= pivot:

l[i],l[j] = l[j],l[i]

i += 1

l[r],l[i] = l[i],l[r]

return i

分析上述兩個排序演算法,其不同之處就在於:

歸併需要利用_merge(l,p,q,r)函式將兩個子串行合併,而快排則是需要利用_partition(l, p , r)函式將序列分為兩個子串行。

資料結構與演算法 歸併排序

include include include string include include include include algorithm using namespace std void merge vector input,int left,int mid,int right,vector...

資料結構與演算法(歸併排序)

歸併排序是採用分治法的乙個典型的應用,歸併排序的思想就是先遞迴分解陣列,在合併陣列。將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的前面的數,誰小就先取誰,取了後相應的指標就往後移一位,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。def merge sort alis...

資料結構與演算法 歸併排序

你可以在 的 mer 標籤中看到歸併排序的動畫。歸併排序 時間複雜度 o nlogn 空間複雜度 o n 基本思想 分治思想。8 6 2 3 1 5 7 4 分 8 6 2 3 1 5 7 4 分 8 6 2 3 1 5 7 4 分 8 6 2 3 1 5 7 4 並 8 6 2 3 1 5 7 4...