栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

经典排序算法python实现

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

经典排序算法python实现

仅提供python实现与简单注释
排序算法具体介绍请看:
https://www.pythonsky.cn/python/257.html
https://www.cnblogs.com/onepixel/p/7674659.htm
https://blog.csdn.net/Dby_freedom/article/details/82154869

排序算法性能指标

排序算法分类

冒泡排序

def bubbleSort(nums):
    n = len(nums)
    k = n-1
    for i in range(n-1):
        flag = False #指示该趟排序是否交换
        for j in range(k):
            if nums[j] > nums[j+1]:
                nums[j], nums[j+1] = nums[j+1], nums[j]
                k = j #最后一次发生交换的位置,nums[k]后的数据都为有序
                flag = True #发生交换
        if not flag: break #无交换代表数组有序,则提前终止排序
    return nums

选择排序

def selectionSort(nums):
    n = len(nums)
    for i in range(n-1):
        k = i #代表[i,n-1]内最小值下标,每趟把该范围内的最小值交换到位置i
        for j in range(i+1, n):
            if nums[j] < nums[k]:
                k = j #找到更小的值,更改下表
        nums[i], nums[k] = nums[k], nums[i] #发生一趟交换
    return nums

插入排序1:简单插入排序

def insertionSort(nums):
    n = len(nums)
    for i in range(1,n):
        tmp = nums[i]#保存当前位置的值
        j = i
        while j and nums[j-1] > tmp:#所有大于nums[i]的值后移一位
            nums[j] = nums[j-1]
            j -= 1
        nums[j] = tmp #nums[i]移动到正确位置
    return nums

插入排序2:希尔排序

def shellSort(nums):
    n = len(nums)
    gap = n//2 #把数组分成gap组,相隔距离为gap的值在同一组
    while gap >= 1: #gap为1时执行最后一趟排序
        for i in range(gap,n):
            tmp = nums[i]
            j = i
            while j and nums[j-gap] > tmp: #以gap为间隔执行简单插入排序
                nums[j] = nums[j-gap]
                j -= gap
            nums[j] = tmp
        gap // 2 #gap减半
    return nums

快速排序

def quickSort(nums,l,r):
    def partition(nums,l,r):
        i,j = l,r
        while i= nums[l]: j-=1
            while i= r: return
    mid = partition(nums,l,r)
    quickSort(nums,l, mid-1)#递归排序标兵左边数组
    quickSort(nums, mid+1,r)#递归排序标兵右边数组
    
    return nums

归并排序

def mergeSort(nums):
    def merge(nums1,nums2):#常规的合并有序数组
        nums = []
        L1,L2 = len(nums1),len(nums2)
        i = j = 0
        while i 

计数排序

def countingSort(nums):
    n = len(nums)
    if not n: return []
    minval = maxval = nums[0]
    for num in nums:#寻找数组内最小值与最大值
        minval = min(minval, num)
        maxval = max(maxval, num)
    counter = {}#使用哈希表记录,但貌似一般的计数排序不使用哈希表
    for num in nums:#计数
        if num in counter:
            counter[num] += 1
        else:
            counter[num] = 1
    nums = []
    for num in range(minval, maxval+1):#从最小到最大遍历
        if num in counter:#存在则添加至有序数组
            n = counter[num]
            nums += [num]*n
    return nums

基数排序

def radixSort(nums):
    maxval = nums[0]
    n = len(nums)
    for i in range(1,n):#寻找最大值
        maxval = max(maxval, nums[i])
    
    k = 0
    while maxval:#计算最大值的位数
        maxval //= 10
        k += 1
    for i in range(k):
        radix = [[]for _ in range(10)]#0-9共10个基数数组
        divisor = 10**i
        surplus = 10*divisor
        for num in nums:
            j = (num%surplus)//divisor #右往左提取第i+1位
            radix[j].append(num)#加入对应基数数组
        nums = []
        for idx,rad in enumerate(radix):#对每个基数数组进行计数排序
            if rad == []: continue
            nums  += countingSort(rad)
    return nums
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920405.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号