第 1 章 一大波数正在靠近——排序

第 1 节 最快最简单的排序——桶排序

# 第 1 节 最快最简单的排序——桶排序
import numpy as np


# 时间复杂度 O(M+N)
# M:桶的个数
# N:待排序数的个数
def sort(a):
    b = np.zeros(11, dtype=int)
    # 进行计数
    for v in a:
        temp = b[v]
        b[v] = temp + 1
    print(b)
    print('排序结果:', end="\t")
    # 出现了几次就打印几次
    for (i, v) in enumerate(b):
        for j in range(1, v + 1):
            print(i, end="\t")


if __name__ == '__main__':
    array = [5, 2, 5, 3, 8]
    sort(array)
 

第 2 节 邻居好说话——冒泡排序

冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。

# 第 2 节 邻居好说话——冒泡排序
def bubble_sort(a):
    print(a)
    n = len(a)
    for i in range(n):  # 比较n-1趟
        for j in range(n - i - 1):
            # 从第一个数开始和后面的数比较,比较次数:n-i-1
            if a[j] < a[j + 1]:
                t = a[j + 1]
                a[j + 1] = a[j]
                a[j] = t




if __name__ == '__main__':
    a = [23, 456, 78, 8, 9, 23, 561, 323, 11, 8]
    bubble_sort(a)
    print("结果:")
    print(a)

第 3 节 最常用的排序——快速排序

# 第 3 节 最常用的排序——快速排序
# 时间复杂度:最差O( N2),平均时间复杂度为 O( Nlog N)
def quick_sort(left, right, array):
    i = left
    j = right
    if left > right:
        return
        # 基数取左边第一个
    temp = array[left]
    while i != j:
        # 顺序很重要,要先从右往左找。为什么?
        # 先从在边开始时,那么 i 所停留的那个位置肯定是大于基数6的
        while (a[j] >= temp) and (i < j):
            j = j - 1
        # 再从左往右找
        while (a[i] <= temp) and (i < j):
            i = i + 1
        # 当哨兵i和哨兵j没有相遇时 交换位置
        if i < j:
            t = array[j]
            array[j] = array[i]
            array[i] = t
    # print(i)
    # 将基数 temp放到i的位置,左边都是小于基数的,右边都是大于基数的
    array[left] = array[i]
    array[i] = temp
    # 递归
    quick_sort(left, i - 1, a)
    quick_sort(i + 1, right, a)

if __name__ == '__main__':
    a = [6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
    print("数组:", a)
    quick_sort(0, len(a) - 1, a)
    print("结果:", a)

第 4 节 小哼买书

桶排序是最快的,它的时间复杂度是O( N+ M);冒泡排序是 O( N2);快速排序是 O( Nlog N)。

小哼将按照排序好的 ISBN 号去书店买书。请你协助小哼完成“去重”与“排序”的工作。

# 第 4 节 小哼买书
import numpy as np


# 时间复杂度 O(M+N)
# M:桶的个数
# N:待排序数的个数

def sort(a):
    b = np.zeros(1000, dtype=int)
    # 进行计数
    for v in a:
        temp = b[v]
        b[v] = temp + 1
    # print(b)
    print('排序结果:', end="\t")
    # 出现了几次都打印一次,以达到去重的目的
    for (i, v) in enumerate(b):
        if v > 0:
            print(i, end="\t")


if __name__ == '__main__':
    array = [20, 40, 32, 67, 40, 20, 89, 300, 400, 15]
    sort(array)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值