Python 排序算法

一、冒泡排序

原理:循环第一次找最小的,逐步交换到第一个位置,循环第二次找第二小,逐步交换到第二个位置…直到遍历完整个数组即可。

def bubble_sort(p_list):
    for i in range(len(p_list)):
        for j in range(len(p_list) - 1, i, -1):
            if p_list[j] < p_list[j - 1]:
                p_list[j], p_list[j - 1] = p_list[j - 1], p_list[j]

二、选择排序

原理:与冒泡排序本质相同,区别在每次循环中,找到剩余元素中的最小值时,一次交换到最终位置

def select_sort(p_list):
    for i in range(len(p_list)):
        min_id = i
        for j in range(i + 1, len(p_list)):
            if p_list[min_id] > p_list[j]:
                min_id = j
        if min_id != i:
            p_list[i], p_list[min_id] = p_list[min_id], p_list[i]

三、直接插入排序

原理:将数组分为左右两部分,左边默认为有序序列,右边为无序序列,初始时,左边序列只有第一元素;

遍历右边所有元素将其按照大小逐步移动到左边序列中去,每次遍历的元素实际上都是无序序列中的第一个元素,其左边既是有序序列中最后一个元素。

def insert_sort(p_list):
    for i in range(1, len(p_list)):
        for j in range(i, 0, -1):
            if p_list[j] < p_list[j - 1]:
                p_list[j], p_list[j - 1] = p_list[j - 1], p_list[j]

四、希尔排序

原理:提供一个增量序列,在遍历数组,进行比较时,两个元素间id的差值由增量序列来提供,并且每次都将与当前元素的id差值为增量整数倍的元素进行比较;

最后一个增量总是1;增量序列为递减的;增量序列长度太小会导致无法准确排序。

def shell_sort(p_list):
    increment = len(p_list)
    while increment > 1:
        increment = int(increment / 3) + 1
        for i in range(increment, len(p_list), 1):
            for j in range(i, 0, -increment):
                if p_list[j] < p_list[j - increment]:
                    p_list[j], p_list[j - increment] = p_list[j - increment], p_list[j]

五、快速排序

原理:基于二分和递归的思想,选择一个基准数,通过移动元素使在待排序数组中,其左边元素都比它小,右边元素都比它大;

然后将左右两边分别再进行快速排序即可。

def quick_sort(p_list):
    quick_div(p_list, 0, len(p_list) - 1)


def quick_div(p_list, p_start, p_end):
    if p_start < p_end:
        mid_id = quick_part(p_list, p_start, p_end)
        quick_div(p_list, p_start, mid_id - 1)
        quick_div(p_list, mid_id + 1, p_end)


def quick_part(p_list, p_start, p_end):
    part_key = p_list[p_start]
    while p_start < p_end:
        while p_start < p_end and p_list[p_end] > part_key:
            p_end -= 1
        p_list[p_end], p_list[p_start] = p_list[p_start], p_list[p_end]
        while p_start < p_end and p_list[p_start] < part_key:
            p_start += 1
        p_list[p_end], p_list[p_start] = p_list[p_start], p_list[p_end]
    return p_start

点赞