一、冒泡排序
原理:循环第一次找最小的,逐步交换到第一个位置,循环第二次找第二小,逐步交换到第二个位置…直到遍历完整个数组即可。
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