【2】数据结构与算法--python语言实现各类排序算法(快排,简单选择,直接插入,堆排序,二路归并,冒泡排序)

def bubble_sort(a):
    # 冒泡排序
    for i in range(len(a)):
        # 主要是判断当前这一轮过去有没有交换,
        # 如果有交换就将其赋值为True,如果没交换说明这一轮过去顺序都是从小到大,直接跳出循环即可。
        sign = False
        for j in range(0, len(a)-1-i):
            if a[j] > a[j+1]:
                temp = a[j+1]
                a[j+1] = a[j]
                a[j] = temp
                sign = True
        if sign == False:
            break
    return a

def insert_sort(a):
    # 直接插入排序
    for i in range(len(a)):
        temp = a[i]
        j = i-1
        while a[j] > temp and j >= 0:
            a[j+1] = a[j]
            j -= 1
        a[j+1] = temp
    return a

def select_sort(a):
    # 简单选择排序
    for i in range(len(a)):
        k = i
        min = a[i]
        for j in range(i+1, len(a)):
            if a[j] < min:
                min = a[j]
                k = j

        temp = a[k]
        a[k] = a[i]
        a[i] = temp
    return a


def quick_sort(a, low, high):
    # 快速排序算法
    i = low
    j = high
    if low > high:
        return
    if i < j:
        temp = a[i]
        while i != j:
            while j > i and a[j] > temp:
                j -= 1
            if j > i:
                a[i] = a[j]
                i += 1
            while j > i and a[i] < temp:
                i += 1
            if j > i:
                a[j] = a[i]
                j -= 1
        a[i] = temp
    quick_sort(a, low, i-1)
    quick_sort(a, i+1, high)
    return a


# 下面是归并排序的算法  分两步: 1.形成初始化归并段。 2.归并阶段
def fen_duan(list):
    # 分段
    if len(list) <= 1:
        return list
    zhong = int(len(list) / 2)
    left = fen_duan(list[:zhong])   # 一直递归下去进行分段直到剩下一个数
    right = fen_duan(list[zhong:])
    return merge(left, right)
def merge(left, right):
    # 合并段+排序
    i, j = 0, 0
    array = []
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            array.append(left[i])
            i += 1
        elif left[i] > right[j]:
            array.append(right[j])
            j += 1
    if i < len(left):
        array += left[i:]
    if j < len(right):
        array += right[j:]
    return array

# 下面是堆排序的算法(本次采用大顶堆)  # 一个是排序  一个是调整堆
def Sift(a, low, high):
    # 调整堆
    i = low
    j = 2*i   # 当前这个双亲的左孩子开始调整树
    temp = a[i]
    while j <= high:
        if j < high and a[j] < a[j+1]:   # 如果右孩子大,则将j指向右孩子
            j += 1
        if temp < a[j]:    # 此时双亲小于右孩子  则右孩子和双亲换位置
            a[i] = a[j]
            i = j          # 修改i和j的值, 以便继续向下调整
            j = 2*i
        else:
            break
    a[i] = temp
def heapSort(a):
    for i in range(len(a)//2-1, -1, -1):   # len(a)//2-1 是最后一个双亲节点的索引
        Sift(a, i, len(a)-1)
    for i in range(len(a)-1, -1, -1):
        temp = a[0]    # 将头取出来
        a[0] = a[i]    # 将树的最后一个节点放在头
        a[i] = temp    # 将头放到最后
        Sift(a, 0, i-1)
    return a



if __name__ == '__main__':
    a = [3, 4, 31, 61, 16, 5, 0, 21, 7]    # 随机给出一些数字

    # result_b = bubble_sort(a)
    # print("冒泡排序的结果:", result_b)

    # result_i = insert_sort(a)
    # print("直接插入排序的结果:", result_i)

    # result_s = select_sort(a)
    # print("简单选择排序的结果:", result_s)

    # result_q = quick_sort(a, 0, len(a)-1)
    # print("快速排序的结果:", result_q)

    # result_m = fen_duan(a)
    # print("归并排序的结果:", result_m)

    result_h = heapSort(a)
    print("堆排序的结果:", result_h)

 

全部评论

相关推荐

头像
昨天 13:17
已编辑
苏州大学 Java
面试官真的很有耐心,人非常nice,但问得也是真的很细。面完半小后约HR面。有没有人说说HR面会问啥?【希望能过吧,以前真没想到面个试这么耗精力,这一周感觉都被掏空了】1.请做一下自我介绍。2.你掌握的数据结构有哪些?3.请讲一下一致性哈希的原理和解决的问题。4.请讲一下Ring&nbsp;buffer(环形缓冲区)的相关内容。5.请讲解一下HTTP状态码的相关分类和含义(如2xx、3xx、4xx、5xx)。6.请讲解一下四层网络负载均衡和七层网络负载均衡的区别,以及各自的应用场景。7.请讲一下反向代理的原理和常用工具,以及正向代理的相关内容。8.进程间通信的方式有哪些?哪种方式效率更高,为什么?9.请讲一下MySQL主从复制的实现原理(基于binlog、redolog相关)。10.多个从节点之间出现数据不一致的问题该如何解决?11.你了解的消息中间件有哪些?RabbitMQ、RocketMQ、Kafka这三种消息中间件的区别是什么?12.Redis中最常用的数据结构有哪些?13.请讲一下Redis中Zset(sorted&nbsp;set)的底层实现和优化策略。14.什么是小哈希和大哈希,二者在查找、插入性能上有什么区别?15.请讲一下TCC分布式事务算法的相关内容,以及它和2PC、3PC的区别。16.你在项目中使用的服务发现组件是什么,它的实现原理是什么?17.你在项目中使用的序列化协议是什么,为什么选择该协议?18.长连接的适用场景是什么?哪些场景不适合使用长连接,原因是什么?19.请设计一个评论系统(包括数据库表设计、数据结构、关联关系等)。20.【反问】想具体知道会做哪些模块的工作?有没有导师?
百特曼3:节子还是一如既往的八股大厂
查看78道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务