十大排序算法代码(Python)

本文介绍了快速排序、选择排序和归并排序三种经典排序算法的Python实现,并通过示例展示了它们的工作原理。从基础的交换操作到高效的数据组织,适合开发者快速查阅和实践。

本博客是建立在已经掌握原理的基础上来方便快速查阅代码的,原理见十大排序算法(Python实现)

快速排序

def partition(arr,low,high): 
    '''分割数组
    '''
    i = ( low-1 )         # 最小元素索引
    pivot = arr[high]     # 可以将任意值作为初始基准值,这里为了方便采取首元素或者尾元素
    for j in range(low , high): 
        # 当前元素小于或等于 pivot 
        if   arr[j] <= pivot: 
            i = i+1 
            arr[i],arr[j] = arr[j],arr[i] 
    arr[i+1],arr[high] = arr[high],arr[i+1] 
    return i+1

def quick_sort(arr,low,high): 
    if low < high: 
        pi = partition(arr,low,high) 
        quick_sort(arr, low, pi-1) 
        quick_sort(arr, pi+1, high) 
    return arr

arr = [3,1,4,5,6]
quick_sort(arr,0,len(arr)-1)
print(arr)

选择排序

def selection_sort(arr):
    '''选择排序
    '''
    for i in range(len(arr) - 1):
        # 记录最小数的索引
        min_index = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[min_index]:
                min_index = j
        # i 不是最小数时,将 i 和最小数进行交换
        if i != min_index:
            arr[i], arr[min_index] = arr[min_index], arr[i]
    return arr

冒泡排序

def bubble_sort(arr):
    '''冒泡排序
    '''
    for i in range(1, len(arr)):
      	found = False # 定义是否发现逆序的flag
        for j in range(0, len(arr)-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                found = True
            if not found:
              break
    return arr

计数排序

def counting_sort(arr):
	'''只适用于整数数组
	'''
    bucket_len = max(arr)+1 # 新数组长度为arr中的最大值+1
    bucket = [0]*bucket_len
    # 开始计数
    for i in range(len(arr)):
        if not bucket[arr[i]]:
            bucket[arr[i]]=0
        bucket[arr[i]]+=1
    # 按顺序重新填入
    sorted_index = 0
    for j in range(bucket_len):
        while bucket[j]>0:
            arr[sorted_index] = j
            sorted_index+=1
            bucket[j]-=1
    return arr

归并排序

def merge(left,right):
    '''合并
    '''
    res = []
    while left and right:
        if left[0] <= right[0]:
            res.append(left.pop(0)) # pop(0) 弹出首元素
        else:
            res.append(right.pop(0))
    while left:
        res.append(left.pop(0))
    while right:
        res.append(right.pop(0))
    return res
def merge_sort(arr):
    import math
    if(len(arr)<2):
        return arr
    middle = len(arr)//2
    left, right = arr[0:middle], arr[middle:]
    return merge(merge_sort(left), merge_sort(right))
    
arr  = [3,1,2,4]
print(merge_sort(arr))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值