各種排序算法 python實現

冒泡排序:

from random import randint

def show_data(data):
    for i in data:
        print(i, end=',')

def bubble_sort(data):
    """冒泡排序"""
   """每輪都將較大的數移動到后面"""

    print("排序前:")
    show_data(data)
    n = len(data)
    for i in range(n-1):
        flag = 0
        for j in range(n-1-i):
            if data[j] > data[j+1]:
                data[j], data[j+1] = data[j+1], data[j]
                flag = 1
        if flag == 0:
            break

    print("\n排序后:")
    show_data(data)


data = [randint(0,100) for _ in range(30)]
bubble_sort(data)

排序前:
41,55,0,80,44,99,76,26,37,38,6,9,99,43,1,49,65,15,72,21,100,45,65,84,97,24,95,61,39,48,
排序后:
0,1,6,9,15,21,24,26,37,38,39,41,43,44,45,48,49,55,61,65,65,72,76,80,84,95,97,99,99,100,

選擇排序:

from random import randint

def show_data(data):
    for i in data:
        print(i, end=',')

def select_sort(data):
    """選擇排序"""

    print("排序前:")
    show_data(data)

    n = len(data)
    for i in range(n-1):
        minIndex = i
        for j in range(i+1,n):
            if data[j] < data[minIndex]:
                minIndex = j

        data[i], data[minIndex] = data[minIndex], data[i]

    print("\n排序后:")
    show_data(data)

>>data = [randint(0,100) for _ in range(30)]
>>select_sort(data)

排序前:
34,0,85,60,18,68,45,58,70,6,12,42,28,52,15,81,74,7,57,76,62,19,39,36,83,82,90,13,9,82,
排序后:
0,6,7,9,12,13,15,18,19,28,34,36,39,42,45,52,57,58,60,62,68,70,74,76,81,82,82,83,85,90,

插入排序:

import random

def show_data(data):
    for i in data:
        print(i, end=',')


def insert_sort(data):
    """插入排序"""
    print("排序前:")
    show_data(data)
    for i in range(1, len(data)):
        temp = data[i]
        front = i - 1
        while front >=0 and data[front] > temp:
            data[front+1] = data[front]
            front -= 1
        data[front+1] = temp
    print("\n排序后:")
    show_data(data)

>>data = [i for i in range(100)]
>>random.shuffle(data)
>>insert_sort(data)

排序前:
87,73,66,69,68,36,25,17,74,92,23,89,77,41,38,45,1,51,6,13,79,33,24,46,90,63,29,27,37,95,58,96,34,4,62,20,19,55,97,93,26,32,22,61,50,78,83,28,80,8,15,56,75,84,12,2,67,9,59,43,88,72,31,85,71,35,76,10,99,86,48,82,42,98,81,30,14,16,52,39,7,65,47,60,21,91,64,3,53,11,5,44,57,70,40,18,0,94,54,49,
排序后:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,

希爾排序:

import random

def show_data(data):
    for i in data:
        print(i, end=',')


def shell_sort(data,step=2):
    """插入排序"""
    print("排序前:")
    show_data(data)
    gap = len(data) // step
    while gap != 0:
        ################insert_sort######################
        for i in range(1, len(data)):
            temp = data[i]
            front = i - gap
            while front >=0 and data[front] > temp:
                data[front+gap] = data[front]
                front -= gap
            data[front+gap] = temp
        ##################################################
        gap //= step
    print("\n排序后:")
    show_data(data)

>>data = [i for i in range(100)]
>>random.shuffle(data)
>>shell_sort(data)

排序前:
82,75,49,39,8,80,87,47,33,38,91,13,78,84,89,85,52,41,71,79,19,55,94,98,42,32,26,57,23,14,29,67,21,4,10,56,96,27,44,81,0,90,99,68,64,70,40,86,63,9,7,46,74,72,77,48,35,58,88,92,31,18,3,20,59,36,95,28,2,34,5,45,93,53,54,17,65,12,30,50,24,62,69,66,76,25,22,15,60,11,16,6,37,83,61,43,73,51,1,97,
排序后:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,

堆排序:

import random

def show_data(data):
    for i in data:
        print(i, end=',')


def heapify(data, n, i):
    """將子樹調整為大頂堆"""
    c1 = 2*i + 1
    c2 = 2*i + 2
    maxIndex = i
    if c1 < n and data[c1] > data[maxIndex]:
        maxIndex = c1
    if c2 < n and data[c2] > data[maxIndex]:
        maxIndex = c2
    if maxIndex != i:
        data[maxIndex], data[i] = data[i], data[maxIndex]
        heapify(data, n, maxIndex)



def heap_sort(data):
    """堆排序"""
    print("排序前:")
    show_data(data)
    for i in range(len(data)//2-1, -1, -1):
        heapify(data, len(data), i)
    for i in range(len(data)-1, 0, -1):
        data[0], data[i] = data[i], data[0]
        heapify(data, i, 0)
    print("\n排序后:")
    show_data(data)
>>data = [i for i in range(100)]
>>random.shuffle(data)
>>heap_sort(data)

排序前:
89,4,42,51,93,25,62,50,60,75,5,37,3,27,54,79,87,43,98,48,64,10,70,13,83,20,41,90,35,21,40,19,53,36,78,57,81,26,92,86,7,66,59,69,63,99,44,2,45,29,24,94,32,97,55,85,73,1,74,71,65,80,9,17,82,14,88,39,28,58,11,22,18,6,52,56,95,47,46,33,91,84,38,96,23,34,77,31,61,16,15,68,12,0,76,72,30,67,49,8,
排序后:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,

快速排序:

import random

def show_data(data):
    for i in data:
        print(i, end=',')

def quick_sort(data, left, right):
    """快速排序"""
    if left < right:
        mid = partition(data,left, right)
        quick_sort(data, left, mid-1)
        quick_sort(data, mid+1,right)

def partition(data, left, right):

    pivot = data[left]
    while left < right:
        while left < right and data[right] >= pivot:
            right -= 1
        data[left] = data[right]
        while left < right and data[left] <= pivot:
            left += 1
        data[right] = data[left]

    data[left] = pivot
    return left


>>data = [i for i in range(100)]
>>random.shuffle(data)
>>print("排序前:")
>>show_data(data)
>>quick_sort(data, 0, len(data)-1)
>>print("\n排序后:")
>>show_data(data)

排序前:
48,47,84,45,85,32,64,24,11,89,5,50,16,91,38,75,22,15,36,9,2,7,58,10,87,23,25,29,18,95,70,98,80,37,34,96,56,21,82,72,55,74,99,33,62,3,14,26,97,53,4,66,78,1,88,90,8,0,68,86,92,43,46,30,31,57,27,35,59,69,40,71,81,28,65,42,20,17,41,52,19,44,60,93,94,76,63,6,61,49,77,13,39,73,12,83,51,79,54,67,
排序后:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,

計數排序:

import random

def show_data(data):
    for i in data:
        print(i,end=' ')

def count_sort(data):
    """計數排序"""
    print('排序前:')
    show_data(data)
    maxVal, minVal = max(data), min(data)
    #建桶
    buckets = [0] * (maxVal - minVal + 1)
    #計數
    for i in data:
        buckets[i-minVal] += 1
    data.clear()
    result = []
    for ele, times in enumerate(buckets):
        for i in range(times):
            result.append(ele+minVal)
    print('\n排序后:')
    show_data(result)

    return result

>>data = [random.randint(20,60) for i in range(100)]
>>count_sort(data)

排序前:
58 60 53 24 43 32 47 28 26 32 48 48 56 44 56 23 35 21 53 40 27 43 26 34 51 27 53 58 22 21 47 27 33 49 23 22 46 31 26 50 50 43 48 32 30 40 59 32 27 28 49 32 22 38 48 59 51 21 55 38 50 33 54 52 50 57 41 53 20 48 56 32 52 40 35 37 41 56 24 24 49 35 59 51 53 20 31 51 60 21 38 29 33 48 46 49 56 21 26 27 
排序后:
20 20 21 21 21 21 21 22 22 22 23 23 24 24 24 26 26 26 26 27 27 27 27 27 28 28 29 30 31 31 32 32 32 32 32 32 33 33 33 34 35 35 35 37 38 38 38 40 40 40 41 41 43 43 43 44 46 46 47 47 48 48 48 48 48 48 49 49 49 49 50 50 50 50 51 51 51 51 52 52 53 53 53 53 53 54 55 56 56 56 56 56 57 58 58 59 59 59 60 60 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容