(这里默认排序是从小到大)
关于每种排序的视频讲解,参见普林斯顿的算法课

选择排序 selection sort

每次选择最小的放到左边

# 选择排序 selection sort
def Selection_sort(a):
    n = len(a)
    for i in range(n):
        Min = i
        for j in range(i,n):
            if a[j]<a[Min]:
                Min=j
        t=a[i]
        a[i] = a[Min]
        a[Min] = t
    return a

插入排序 insertion sort

依次插入到之前合适的位置

# 插入排序 insertion sort
def Insertion_sort(a):
    n = len(a)
    for i in range(1,n):
        j = i
        while j >= 0 and a[j] < a[j-1]:
            t = a[j]
            a[j] = a[j-1]
            a[j-1] = t
            j = j-1
    return a

希尔排序 Shellsort

跨步排序,步长逐渐缩小

# 希尔排序 Shellsort
def Shellsort(a):
    n = len(a)
    h = 1
    while h < n/3:
        h=int(3 * h + 1)
    while h >= 1:
        i = 0
        while i+h < n:
            j=i+h
            while (j-h >= 0) & (a[j] < a[j-h]):
                t = a[j]
                a[j] = a[j-h]
                a[j-h] = t
                j = j-h
            i=i+1
        h = int(h/3)
    return a

归并排序 Mergesort

对半递归排序,再合并

# 归并排序 Mergesort
def Mergesort(a):
    msort(a,0,len(a)-1)
    return a

def msort(a,lo,hi):
    if lo == hi:
        return a[lo]
    else:
        mid = lo + int((hi - lo)/2)
        msort(a, lo, mid)
        msort(a, mid+1, hi)
        merge(a, lo, mid ,hi)

def merge(a,lo,mid,hi):
    aux = len(a)*[0]
    i = lo
    j = mid+1
    for k in range(lo,hi+1):
        aux[k] = a[k]
    for k in range(lo,hi+1):
        if i > mid:
            a[k] = aux[j]
            j = j+1
        elif j > hi:
            a[k] = aux[i]
            i = i+1
        elif aux[i] > aux[j]:
            a[k] = aux[j]
            j=j+1
        else:
            a[k] = aux[i]
            i=i+1   
    return a

快速排序 Quicksort

利用划分元素

# 快速排序 Quicksort
import random
def Quicksort(a):
    random.shuffle(a)
    qsort(a,0,len(a)-1)
    return a

def qsort(a,lo,hi):
    if hi <= lo:
        return
    j = partition(a,lo,hi)
    qsort(a,lo,j-1)
    qsort(a,j+1,hi)    

def partition(a,lo,hi):
    i = lo
    j = hi+1
    v = a[lo]
    while True:
        i = i+1
        while a[i] < v:
            i = i+1
            if i == hi:
                break
        j = j-1
        while v < a[j]:
            j = j-1
            if j == lo:
                break
        if i >= j:
            break
        t = a[i]
        a[i] = a[j]
        a[j] = t
    t = a[j]
    a[j] = a[lo]
    a[lo] = t
    return j

总结

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐