数据结构与算法(十一):归并排序、快速排序

算法原理及其比较

算法基本思想:

  • 归并和快排都是属于分治思想,其不同之处在于:
  • 归并排序首先将原始序列不断二分,最后从叶子结点处,自底向上进行归并;而快速排序则自顶向下地进行,每次随机选择一个元素,将序列分为小于等于和大于该元素的两个序列;
  • 空间复杂度方面,归并排序由于无法原地排序,其空间复杂度为O(n),快排可以原地排序,其空间复杂度为O(1)O(1)
  • 时间复杂度方面,归并排序不管是最好情况、最坏情况,还是平均情况,时间复杂度都是 O(nlogn);而快排则除了最坏情况下为O(n^2),其余情况为O(nlogn).

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)函数将序列分为两个子序列。

猜你喜欢

转载自blog.csdn.net/oYeZhou/article/details/106078389