python 排序算法

一、冒泡排序

两层for循环,内循环比较当前数与下一位的大小,如小,交换位置。

1 def bubble_sort(data):
2     for i in range(len(data)-1):
3         for j in range(len(data)- i -1):
4             if data[j]<data[j + 1]:
5                 data[j], data[j + 1] = data[j + 1], data[j]

 

二、插入排序

循环有序数列后的每一位数,如果大于有序数列的最后一位,则两数交换位置,再与有序数列的最后第二位比较,以此类推。

1 def insect_sort(data):
2     for i in range(1, len(data)):
3         tmp = data[i]
4         j = i - 1
5         while j>=0 and data[j] > tmp:
6             data[j],data[j + 1] = data[j + 1],data[j]
7             j -= 1
8         data[j + 1] = tmp

 

三、选择排序

每次for循环都找出最小的数,作为该次循环的结果

复制代码
1 def select_sort(data):
2     for i in range(len(data)-1):
3         min_num = i
4         for j in range(i+1, len(data)):
5             if data[j]<data[i]:
6                 min_num = j
7             data[i], data[min_num] = data[min_num], data[i]

 

复制代码

四、快排

选第一个数,从左开始循环比较,如小于,停止循环,将小的数放至第一个数位置,从右开始循环,如大于,停止循环,将大的数放到上次循环空位上,如此循环直到left = right,返回mid,进行递归

复制代码
 1 def quick_sort(data,left,right):
 2     if left<right:
 3         mid = partition(data,left,right):
 4         quick_sort(data,left,mid-1)
 5         quick_sort(data,mid+1,right)
 6 
 7 def partition(data,left,right):
 8     tmp = data[left]
 9     while left < right:
10         while left < right and data[right]>=tmp:
11             right -= 1
12         data[left] = data[right]
13         while left < right and data[left]<=tmp:
14             left += 1
15         data[right] = data [left]
16     data[left] = tmp
17     return left
复制代码

 

五、堆排序

先从最小的有子节点的父节点开始循环调整建堆,然后取数,将堆末与堆顶换位,再进行一次除开已换下位的堆顶的调整,如此循环。

复制代码
def sift(data,low,high):
    i = low
    j = 2*i + 1
    tmp = data[i]
    while j <= high:  # 只要没到最后根最后
        if j < high and data[j] < data[j + 1]:  # 是否有右孩子,且右孩子大于左孩子
            j = j + 1  # j 成为最大孩子的下标
        if tmp < data[j]:  # 最大的孩子是否大于父亲
            data[i] = data[j]  # 子孩子上位
            i = j  # 重新赋值下标
            j = 2*i + 1
        else:  # 上述条件都不满足,跳出循环
            break
    data[i] = tmp

def heap_sort(data):
    n = len(data)
    for i in range(n // 2 -1 ,-1,-1):
        sift(data,i,n-1)
    for i in range(n-1,-1,-1):
        data[0],data[i] = data[i],data[0]
        sift(data,0,i-1)
复制代码

 

posted @   有虫子啊  阅读(303)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示