隨時要手撕的七種排序算法

隨時要手撕的七種排序算法

# 1. 快排
def qsort(arr):
    def sort(arr, start, end):
        if start >= end: return
        i, j = start, end
        key = arr[start]
        while i < j:
            # 從右邊找起
            while i < j and arr[j] >= key: j -= 1
            arr[i] = arr[j]
            while i < j and arr[i] <= key: i += 1
            arr[j] = arr[i]
        arr[i] = key
        sort(arr, start, i - 1)
        sort(arr, i + 1, end)

    sort(arr, 0, len(arr) - 1)
    return arr


# 2. 堆排序
def hsort(arr):
    def heapAdjust(arr, start, end):
        dad, son = start, 2 * start + 1
        while son <= end:
            if son + 1 <= end and arr[son] < arr[son + 1]: son += 1
            if arr[dad] < arr[son]: arr[dad], arr[son] = arr[son], arr[dad]
            dad, son = son, 2 * son + 1

    for i in range(len(arr) // 2 - 1, -1, -1):
        heapAdjust(arr, i, len(arr) - 1)  # 從最右下的父節(jié)點開始
    for i in range(len(arr) - 1, -1, -1):
        arr[0], arr[i] = arr[i], arr[0]
        heapAdjust(arr, 0, i - 1)  # 剩余的n-1個
    return arr


# 3. 冒泡
def bsort(arr):
    for i in range(len(arr)):
        for j in range(1, len(arr) - i):
            if arr[j - 1] > arr[j]: arr[j - 1], arr[j] = arr[j], arr[j - 1]  # 逆序則交換
    return arr


# 4. 選擇
def csort(arr):
    def argmin(arr, start):
        ind = start
        for i in range(start, len(arr)):
            if arr[i] < arr[ind]: ind = i
        return ind

    # 從后面選擇一個最小的放入排序序列的第i個
    for i in range(len(arr)):
        ind = argmin(arr, i)
        arr[i], arr[ind] = arr[ind], arr[i]
    return arr


# 5. 插入
def isort(arr, start=0, delta=1):
    for i in range(start, len(arr), delta):
        key, j = arr[i], i - 1
        while j >= 0 and arr[j] > key:
            arr[j + 1], j = arr[j], j - delta
        arr[j + 1] = key
    return arr


# 6. 歸并
def msort(arr):
    def merge(a, b):
        ind = len(a) + len(b) - 1
        i, j = len(a) - 1, len(b) - 1
        a = a + [0] * len(b)
        while i >= 0 and j >= 0:
            if a[i] > b[j]:
                a[ind] = a[i]
                ind, i = ind - 1, i - 1
            else:
                a[ind] = b[j]
                ind, j = ind - 1, j - 1
        while j >= 0:
            a[ind] = a[j]
            ind, j = ind - 1, j - 1
        return a

    def sort(arr, l, r):
        if l >= r: return [arr[l]]
        mid = l + (r - l) // 2
        # 遞歸歸并左邊的和右邊的, 再合并起來
        return merge(sort(arr, l, mid), sort(arr, mid + 1, r))

    return sort(arr, 0, len(arr) - 1)


# 7. 希爾
def ssort(arr):
    d = len(arr) // 2
    while d >= 2:
        for i in range(d):
            # 根據某一增量進行插入排序
            isort(arr, i, d)
        d //= 2
    return arr


import random

arr = [random.randint(0, 100) for i in range(100)]
print(bsort(arr))
print(csort(arr))
print(isort(arr))
print(ssort(arr))
print(qsort(arr))
print(msort(arr))
print(hsort(arr))
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市往声,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖俊啼,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異解寝,居然都是意外死亡驼仪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門珊楼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來通殃,“玉大人,你說我怎么就攤上這事』啵” “怎么了堕担?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長曲聂。 經常有香客問我霹购,道長,這世上最難降的妖魔是什么朋腋? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任齐疙,我火速辦了婚禮,結果婚禮上旭咽,老公的妹妹穿的比我還像新娘贞奋。我一直安慰自己,他們只是感情好穷绵,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布轿塔。 她就那樣靜靜地躺著,像睡著了一般仲墨。 火紅的嫁衣襯著肌膚如雪勾缭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天宗收,我揣著相機與錄音漫拭,去河邊找鬼。 笑死混稽,一個胖子當著我的面吹牛采驻,可吹牛的內容都是我干的。 我是一名探鬼主播匈勋,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼礼旅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洽洁?” 一聲冷哼從身側響起痘系,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饿自,沒想到半個月后汰翠,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡昭雌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年复唤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烛卧。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡佛纫,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情呈宇,我是刑警寧澤好爬,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甥啄,受9級特大地震影響存炮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜型豁,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一僵蛛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迎变,春花似錦充尉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谆吴,卻和暖如春倒源,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背句狼。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工笋熬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腻菇。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓胳螟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親筹吐。 傳聞我的和親對象是個殘疾皇子糖耸,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355