各种排序算法 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 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容