排序算法——python详解(冒泡排序、选择排序、插入排序、快速排序)

几种常见的排序算法(冒泡排序、选择排序、插入排序、快速排序)

1、冒泡排序

每次比较相邻的两个数,若顺序错误就相互交换。

def sort_bubble(arr):
    for i in range(int(len(arr))):	# 共比较n趟
        for j in range(len(arr) - 1):	# 每趟比较n-1次
            if arr[j] > arr[j + 1]:		# 比较相邻的两个数
                arr[j], arr[j + 1] = arr[j + 1], arr[j]		# 若方向不对,就交换位置

调用:

data1 = [1, 6, 3, 2, 7, 10, 13, 24, 5, 43, 23, 10, 26, 28, 67, 1]
sort_bubble(data1)
2、选择排序

选择排序每趟排序会将目前最大(或最小的)数排好,示例是每趟排好一个最小值。

def sort_selection(arr):
    for i in range(len(arr)):	# 共n趟,arr[i]存储了当前最小的值
        for j in range(i + 1, len(arr)):	# 从i后开始找比i小的
            if arr[i] > arr[j]:		# 比较当前下标i与j的值
                arr[i], arr[j] = arr[j], arr[i]		# 如果比arr[i]小就交换

调用:

data1 = [1, 6, 3, 2, 7, 10, 13, 24, 5, 43, 23, 10, 26, 28, 67, 1]
sort_selection(data1)
3、插入排序

每趟选择一个数,插入到前面已经排好的数列中。

def sort_insertion(arr):
    for i in range(1, len(arr)):	# 第一个数默认排好,选择第二个数开始插入
        j = i - 1	# 从待插入的数前从后向前比较,j记录下标待插入的数需要比较的排好顺序的列表的下标
        temp = arr[i]	# 暂存当前需要插入的数
        while j >= 0:	# 从后向前比较
            if temp < arr[j]:	# 比较当前数比要插入的大小
                arr[j + 1] = arr[j]		# 若比要插入的数大,则该数后移
            else:
                arr[j + 1] = temp	# 若比要插入的数小,则将待插入的数存到当前位置
                break
            j -= 1	# 下标前移

调用:

data1 = [1, 6, 3, 2, 7, 10, 13, 24, 5, 43, 23, 10, 26, 28, 67, 1]
sort_selection(data1)
4、快速排序

快速排序采用分治法思想,采用递归方法完成排序。
基本思路:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

def partition(arr, begin, end):
    flag = 0  # 标识符,记录比较顺序是从前往后还是从后向前
    sub = begin  # 记录待填补的下标
    key = arr[begin]  # 选择第一个作为比较对象
    begin += 1	# 由于是将第一个数作为基准,因此比较从第二个数开始比较
    while begin <= end:		# 前后相等也要比较,因为已经取出第一个数,前后相等即为比较两个数
        if flag == 0:  # 从后向前找比标准值小的,放前面
            if key >= arr[end]:		#比较当前值与基准值大小
                arr[sub] = arr[end]		# 若当前值比基准值小,则将后面的这个较小值填入前面的空中
                sub = end		# 更新当前空的下标
                flag = 1	# 下一次从前向后比
            end -= 1	# 更新后面待比较值的下标
        else:  # 从前向后找比标准值大的,放后面
            if key <= arr[begin]:	# 比较当前值与基准值大小
                arr[sub], sub = arr[begin], begin	# 若当前值比基准值大,则将前面的这个较大值填入后面的空中,并更新空的下标
                flag = 0	# 下一次从后向前比
            begin += 1	# 更新前面待比较值的下标
    arr[sub] = key	# 循环结束,列表已经分为前后两部分,前面的都比基准值小,后面的都比基准值大,将基准值填到目前空的位置,即将列表分为两部分的中间位置
    return sub	# 返回当前的基准值下标,后面将前后两部份分别运算


def sort_quick(arr, begin, end):
    if begin < end:	
        mid = partition(arr, begin, end)	# 将列表分为两部分
        sort_quick(arr, begin, mid - 1)		# 前半部分递归调用
        sort_quick(arr, mid+1, end)			# 后半部分递归调用

调用:

data1 = [1, 6, 3, 2, 7, 10, 13, 24, 5, 43, 23, 10, 26, 28, 67, 1]
sort_quick(data1, 0, len(data1) - 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值