簡(jiǎn)單的排序算法-python

之前面試的時(shí)候經(jīng)常被問(wèn)到排序算法巩那,每次都回答不上來(lái),排序算法算是對(duì)算法的入門,對(duì)于排序算法想要掌握應(yīng)該先掌握排序算法的思想瞳步,代碼是對(duì)思想的展示闷哆,只有真正理解思想后才能真正掌握排序算法,對(duì)于其他的算法肯定也是先掌握思想
下面主要記錄一下簡(jiǎn)單的排序算法单起,冒泡排序抱怔,選擇排序,插入排序嘀倒,希爾排序屈留,歸并排序,快速排序括儒,都按照升序排列

冒泡排序

冒泡排序是對(duì)相鄰的兩個(gè)進(jìn)行比較绕沈,如果后者比前者小則替換位置,然后繼續(xù)向后比較帮寻,這樣每次都能將最大的數(shù)字排到最后乍狐,每次循環(huán)都能將最大的數(shù)字排到最后,排序過(guò)程嵌套兩個(gè)for循環(huán),時(shí)間復(fù)雜度最好時(shí)為O(n)最壞時(shí)為O(n2),平均時(shí)間復(fù)雜度為O(n2)

def bubbleSort(arr):
    for i in range(len(arr)):
        for j in range(1,len(arr) - i):
            if arr[j - 1] > arr[j]:
                arr[j],arr[j - 1] = arr[j - 1],arr[j]
    return arr1

選擇排序

選擇排序相當(dāng)于從數(shù)組中選中一個(gè)最小的數(shù)值放在首位,每次循環(huán)的時(shí)候嵌套的循環(huán)默認(rèn)從未排序的位置開(kāi)始,時(shí)間復(fù)雜度最好時(shí)為O(n2)最壞時(shí)為O(n2),平均時(shí)間復(fù)雜度為O(n2)

def slectSort(arr):
    for i in range(len(arr)):
        for j in range(i,len(arr)):
            if arr[i] > arr[j]:
                arr[j],arr[i] = arr[i],arr[j]
    return arr

插入排序

插入排序類似于打撲克牌時(shí)起牌,新起的牌會(huì)插入到前者小于自己后者大于自己的位置,手中已有重復(fù)的話可以插入同等牌的左邊或者右邊(根據(jù)比較時(shí)從左邊比較還是右邊比較),排序時(shí)先看前面是否有已排好的,如果有的話且滿足最后一個(gè)數(shù)字大于新數(shù)字的話則進(jìn)行位置后移,最后將新數(shù)字插入到preIndex的后一位,時(shí)間復(fù)雜度最好時(shí)為O(n)最壞時(shí)為O(n2),平均時(shí)間復(fù)雜度為O(n2)

def insertSort(arr):
    for i in range(len(arr)):
        preIndex = i - 1
        current = arr[i]
        while preIndex >= 0 and arr[preIndex] > current:
            arr[preIndex + 1] = arr[preIndex]
            preIndex -= 1
        arr[preIndex + 1] = current
    return arr

希爾排序

希爾排序是基于插入排序的以下兩點(diǎn)性質(zhì)而提出改進(jìn)方法的:
插入排序在對(duì)幾乎已經(jīng)排好序的數(shù)據(jù)操作時(shí)固逗,效率高浅蚪,即可以達(dá)到線性排序的效率。
但插入排序一般來(lái)說(shuō)是低效的烫罩,因?yàn)椴迦肱判蛎看沃荒軐?shù)據(jù)移動(dòng)一位惜傲。
希爾排序是通過(guò)一個(gè)增量將需要排序的數(shù)分成多組然后對(duì)每一組進(jìn)行插入排序,這個(gè)增量一般開(kāi)始的時(shí)候?yàn)閿?shù)組數(shù)量的一半,最后為1,代碼中3可以替換為其他的值,會(huì)影響到分組的次數(shù),時(shí)間復(fù)雜度最好時(shí)為O(nlogn)最壞時(shí)為O(nlog2n),平均時(shí)間復(fù)雜度為O(nlog2n)

import math
def shellSort(arr)
    gap = 1
    while gap < math.floor(len(arr) / 3):
        gap = gap * 3 + 1
    while gap > 0:
        for g in range(gap):
            for i in range(g, len(arr), gap):
                preIndex = i - gap
                current = arr[i]
                while preIndex >= 0 and arr[preIndex] > current:
                    arr[preIndex + gap] = arr[preIndex]
                    preIndex -= gap
                arr[preIndex + gap] = current
        gap = math.floor(gap / 3)
    return arr

歸并排序

歸并排序相當(dāng)于將數(shù)組先分為兩組,然后將子數(shù)組再分別分為兩組一直到子子...子數(shù)組里面只有一個(gè)或者0個(gè)元素為止,然后合并這些子數(shù)組一直到將數(shù)組最后合并成一個(gè)有序的數(shù)組,時(shí)間復(fù)雜度最好時(shí)為O(nlogn)最壞時(shí)為O(nlogn),平均時(shí)間復(fù)雜度為O(nlogn)

def mergeSort(arr):
    if len(arr) < 2:
        return arr
    midIndex = math.floor(len(arr) / 2)
    left,right = arr[:midIndex],arr[midIndex:]
    return merge(mergeSort(left),mergeSort(right))

def merge(left,right):
    result = []
    while left and right:
        if left > right:
            result.append(right.pop(0))
        else:
            result.append(left.pop(0))
    while left:
        result.append(left.pop(0))
    while right:
        result.append(right.pop(0))
    return result

快速排序

快速排序命名很粗暴,快速排序是對(duì)冒泡排序的一個(gè)優(yōu)化,首先選擇數(shù)組中的一個(gè)元素,將后面的元素?cái)?shù)值小于這個(gè)數(shù)的放在左邊,大于或者等于的放在右邊,遞歸的對(duì)拆分出的數(shù)組進(jìn)行同樣的排序最后得到一個(gè)有序的數(shù)組,時(shí)間復(fù)雜度最好時(shí)為O(nlogn)最壞時(shí)為O(n2),平均時(shí)間復(fù)雜度為O(nlogn)

def quickSort(arr,left,right):
    if left < right:
        partitionIndex = partition(arr,left,right)
        quickSort(arr,left,partitionIndex - 1)
        quickSort(arr,partitionIndex + 1,right)
    return arr

def partition(arr,left,right):
    provt = left
    index = left + 1
    i = index
    while i <= right:
        if arr[i] < arr[provt]:
            arr[i],arr[index] = arr[index],arr[i]
            index += 1
        i += 1
    arr[index - 1],arr[provt] = arr[provt],arr[index - 1]
    return index - 1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贝攒,隨后出現(xiàn)的幾起案子盗誊,更是在濱河造成了極大的恐慌,老刑警劉巖隘弊,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哈踱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梨熙,警方通過(guò)查閱死者的電腦和手機(jī)开镣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咽扇,“玉大人邪财,你說(shuō)我怎么就攤上這事≈视” “怎么了树埠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)把敞。 經(jīng)常有香客問(wèn)我弥奸,道長(zhǎng),這世上最難降的妖魔是什么奋早? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任盛霎,我火速辦了婚禮赠橙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愤炸。我一直安慰自己期揪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布规个。 她就那樣靜靜地躺著凤薛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诞仓。 梳的紋絲不亂的頭發(fā)上缤苫,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音墅拭,去河邊找鬼活玲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谍婉,可吹牛的內(nèi)容都是我干的舒憾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼穗熬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镀迂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起唤蔗,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤探遵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后妓柜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體别凤,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年领虹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片求豫。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塌衰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝠嘉,到底是詐尸還是另有隱情最疆,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布蚤告,位于F島的核電站努酸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏杜恰。R本人自食惡果不足惜获诈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一仍源、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舔涎,春花似錦笼踩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至挟冠,卻和暖如春于购,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背知染。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工耙替, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怜跑。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓又跛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逸寓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子居兆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Ba la la la ~ 讀者朋友們,你們好啊竹伸,又到了冷鋒時(shí)間泥栖,話不多說(shuō),發(fā)車勋篓! 1.冒泡排序(Bub...
    王飽飽閱讀 1,790評(píng)論 0 7
  • 排序算法說(shuō)明 (1)排序的定義:對(duì)一序列對(duì)象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序吧享; 輸入:n個(gè)數(shù):a1,a2,a3,…,an輸出...
    BULL_DEBUG閱讀 769評(píng)論 0 3
  • 道可道也①,非恒道也②譬嚣。名可名也③钢颂,非恒名也。無(wú)名④拜银,萬(wàn)物之始也殊鞭;有名⑤,萬(wàn)物之母也⑥尼桶。故恒無(wú)欲也⑦操灿,以觀其眇⑧;...
    顏兮優(yōu)兮閱讀 343評(píng)論 1 4
  • 以自己喜歡的方式過(guò)一生 這是之前看過(guò)的一本書(shū)泵督,在雞湯文泛濫的年代成為一股清流趾盐,當(dāng)然也免不了勵(lì)志雞湯的俗氣,總體感覺(jué)...
    Free懶死閱讀 331評(píng)論 0 0
  • 文/星海鷗魚(yú) 序 爸媽總說(shuō)我現(xiàn)在有點(diǎn)兒仙仙兒的久窟,不接地氣兒⊙鸭颍總告訴我別總一個(gè)人悶著瘸羡,一下班連門都不出,除了看書(shū)就是...
    星海鷗魚(yú)閱讀 580評(píng)論 0 2