各种排序算法 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阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容