算法原理及其比较
算法基本思想:
- 归并和快排都是属于分治思想,其不同之处在于:
- 归并排序首先将原始序列不断二分,最后从叶子结点处,自底向上进行归并;而快速排序则自顶向下地进行,每次随机选择一个元素,将序列分为小于等于和大于该元素的两个序列;
- 空间复杂度方面,归并排序由于无法原地排序,其空间复杂度为,快排可以原地排序,其空间复杂度为;
- 时间复杂度方面,归并排序不管是最好情况、最坏情况,还是平均情况,时间复杂度都是 ;而快排则除了最坏情况下为,其余情况为.
Python实现
归并排序:
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]:
tmp.append(L[i])
i += 1
else:
tmp.append(L[j])
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)函数将序列分为两个子序列。