面試準(zhǔn)備--排序

堆排序


def heap_sort(ary) :
    n = len(ary)
    first = int(n/2-1)      #最后一個非葉子節(jié)點
    for start in range(first,-1,-1) :       #構(gòu)造大根堆:最后一個非葉子節(jié)點 -> 根節(jié)點
        max_heapify(ary,start,n-1)
    for end in range(n-1,0,-1):     #堆排笙瑟,將大根堆轉(zhuǎn)換成有序數(shù)組
        ary[end],ary[0] = ary[0],ary[end]       #最大的交換到末尾,調(diào)整交換后的其余節(jié)點
        max_heapify(ary,0,end-1)
    return ary


#最大堆調(diào)整:將堆的末端子節(jié)點作調(diào)整,使得子節(jié)點永遠小于父節(jié)點
#start為當(dāng)前需要調(diào)整最大堆的位置,end為調(diào)整邊界
def max_heapify(ary,start,end):
    root = start
    while True :
        child = root*2 +1       #調(diào)整節(jié)點的子節(jié)點
        if child > end : break
        if child+1 <= end and ary[child] < ary[child+1] :
            child = child+1     #取較大的子節(jié)點
        if ary[root] < ary[child] :     #較大的子節(jié)點成為父節(jié)點
            ary[root],ary[child] = ary[child],ary[root] #交換
            root = child
        else :
            break

快速排序(simple)

# 快排
def quickSort(arr):
    if len(arr)<=1:return arr
    low,pi,high = partition(arr)
    return quickSort(low)+[pi]+quickSort(high)

# 分區(qū)
def partition(arr):
    pi , arr = arr[0],arr[1:]
    low = [x for x in arr if x<=pi]
    high = [x for x in arr if x>pi]
    return low,pi,high

快速排序(regular)

def quick_sort(ary):
    return qsort(ary,0,len(ary)-1)

def qsort(ary,left,right):
    #快排函數(shù)研叫,ary為待排序數(shù)組挨下,left為待排序的左邊界侠仇,right為右邊界
    if left >= right : return ary
    key = ary[left]     #取最左邊的為基準(zhǔn)數(shù)
    lp = left           #左指針
    rp = right          #右指針
    while lp < rp :
        while ary[rp] >= key and lp < rp :
            rp -= 1
        while ary[lp] <= key and lp < rp :
            lp += 1
        ary[lp],ary[rp] = ary[rp],ary[lp]
    ary[left],ary[lp] = ary[lp],ary[left]
    qsort(ary,left,lp-1)
    qsort(ary,rp+1,right)
    return ary

歸并排序

# MergeSort
def mergeSort(arr):
    mid = len(arr)/2
    left ,right = arr[:mid],arr[mid:]
    if len(left)>1:
        left = mergeSort(left)
    if len(right)>1:
        right = mergeSort(right)
    res = []
    while left and right:
        if left[-1]>=right[-1]:
            res.append(left.pop())
        else:
            res.append(right.pop())
    res.reverse()
    return (left or right)+res

Shell排序

def shell_sort(ary):
    n = len(ary)
    gap = round(n/2)       #初始步長 , 用round四舍五入取整
    while gap > 0 :
        for i in range(gap,n):        #每一列進行插入排序 , 從gap 到 n-1
            temp = ary[i]
            j = i
            while ( j >= gap and ary[j-gap] > temp ):    #插入排序
                ary[j] = ary[j-gap]
                j = j - gap
            ary[j] = temp
        gap = round(gap/2)                     #重新設(shè)置步長
    return ary

插入排序

def insert_sort(lists):
    # 插入排序
    count = len(lists)
    for i in range(1, count):
        key = lists[i]
        j = i - 1
        while j >= 0:
            if lists[j] > key:
                lists[j + 1] = lists[j]
                lists[j] = key
            j -= 1
    return lists

選擇排序

def select_sort(ary):
    n = len(ary)
    for i in range(0,n):
        min = i                             #最小元素下標(biāo)標(biāo)記
        for j in range(i+1,n):
            if ary[j] < ary[min] :
                min = j                     #找到最小值的下標(biāo)
        ary[min],ary[i] = ary[i],ary[min]   #交換兩者
    return ary

冒泡排序

def bubble_sort(arry):
    n = len(arry)                   #獲得數(shù)組的長度
    for i in range(n):
        for j in range(1,n-i):
            if  arry[j-1] > arry[j] :       #如果前者比后者大
                arry[j-1],arry[j] = arry[j],arry[j-1]      #則交換兩者
    return arry
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市筑累,隨后出現(xiàn)的幾起案子袱蜡,更是在濱河造成了極大的恐慌,老刑警劉巖慢宗,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殖氏,死亡現(xiàn)場離奇詭異畏纲,居然都是意外死亡磷瘤,警方通過查閱死者的電腦和手機桨吊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缅茉,“玉大人嘴脾,你說我怎么就攤上這事∈叨眨” “怎么了译打?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拇颅。 經(jīng)常有香客問我奏司,道長,這世上最難降的妖魔是什么樟插? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任韵洋,我火速辦了婚禮,結(jié)果婚禮上黄锤,老公的妹妹穿的比我還像新娘搪缨。我一直安慰自己,他們只是感情好鸵熟,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布副编。 她就那樣靜靜地躺著,像睡著了一般旅赢。 火紅的嫁衣襯著肌膚如雪齿桃。 梳的紋絲不亂的頭發(fā)上惑惶,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天煮盼,我揣著相機與錄音,去河邊找鬼带污。 笑死僵控,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鱼冀。 我是一名探鬼主播报破,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悠就,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了充易?” 一聲冷哼從身側(cè)響起梗脾,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盹靴,沒想到半個月后炸茧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡稿静,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年梭冠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片改备。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡控漠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悬钳,到底是詐尸還是另有隱情盐捷,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布他去,位于F島的核電站毙驯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏灾测。R本人自食惡果不足惜爆价,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媳搪。 院中可真熱鬧铭段,春花似錦、人聲如沸秦爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽等限。三九已至爸吮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間望门,已是汗流浹背形娇。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筹误,地道東北人桐早。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哄酝。 傳聞我的和親對象是個殘疾皇子友存,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • 面試準(zhǔn)備-排序 插入排序最簡單的排序算法,由N-1趟排序組成陶衅,根據(jù)已知事實:0~p-1的元素已經(jīng)按序排列(p當(dāng)前第...
    NJUJiachen閱讀 128評論 0 1
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,253評論 0 2
  • 概述 排序有內(nèi)部排序和外部排序屡立,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大搀军,一次不能容納全部...
    zwb_jianshu閱讀 1,133評論 0 0
  • 概述 排序有內(nèi)部排序和外部排序侠驯,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大奕巍,一次不能容納全部...
    閑云清煙閱讀 757評論 0 6
  • 概述 排序有內(nèi)部排序和外部排序吟策,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大的止,一次不能容納全部...
    printf200閱讀 768評論 0 0