当前位置: 首页 > news >正文

1.排序算法(学习自用)

1.冒泡排序

算法步骤

相邻的元素之间对比,每次早出最大值或最小值放到最后或前面,所以形象的称为冒泡。

特点

n个数排序则进行n轮,每轮比较n-i次。所以时间复杂度为O(n^2),空间复杂度为O(1),该排序算法稳定。

代码模板

n = int(input())
a = list(map(int, input().split()))

for i in range(1, n-1):
    for j in range(0, n - i):
        if a[j] > a[j + 1]:
            a[j], a[j + 1] = a[j + 1], a[j]

print(' '.join(map(str, a)))

2.选择排序

算法步骤

从左往右找到最小元素,放在起始位置。依次找到第i个位置的元素。

特点

n个数排序有n个位置,每轮比较n-i次。所以时间复杂度为O(n^2),空间复杂度为O(1),该排序算法稳定。

代码模板

n = int(input())
a = list(map(int, input().split()))

for i in range(0, n-1):
    min_val = a[i]
    min_id = i
    for j in range(i, n):
        if a[j] < min_val:
            min_val = a[j]
            min_id = j
    a[i], a[min_id] = a[min_id], a[i]

print(' '.join(map(str, a)))

3.插入排序

算法步骤

第一个元素看做已排序,从左往右遍历每一个元素。在已排序元素中从后往前扫描:如果当前元素大于新元素,则钙元素移动到后一位。
简单来说,对第i个元素从i向左到i-1找合适的位置插入。

特点

n个数排序则进行n轮插入,每轮比较i次。所以时间复杂度为O(n^2),空间复杂度为O(1),该排序算法不稳定。

代码模板

n = int(input())
a = list(map(int, input().split()))

for i in range(1, n):
    value = a[i]
    insert_id = 0
    for j in range(i - 1, -1, -1):
        if a[j] > value:
            a[j + 1] = a[j]
        else:
            insert_id = j + 1
            break
    a[insert_id] = value

print(' '.join(map(str, a)))

4.快速排序

算法步骤

找一个基准值x,把列表分为三部分:小于等于x的数、x、大于x的数字。左部分和右部分递归使用该策略。

特点

时间复杂度为O(n log(n)),空间复杂度为O(n log(n)),该排序算法不稳定。

代码模板

def partition(a, left, right):
    id = left + 1

    for i in range(left + 1, right + 1):
        if a[i] <= a[left]:
            a[id], a[i] = a[i], a[id]
            id += 1
    a[left], a[id - 1] = a[id - 1], a[left]
    return id - 1

def quicksort(a, left, right):
    if left < right:
        mid = partition(a, left, right)
        quicksort(a, left, mid - 1)
        quicksort(a, mid + 1, right)

n = int(input())
a = list(map(int, input().split()))

quicksort(a, 0 , n - 1)
print(' '.join(map(str, a)))

5.归并排序

算法步骤

先把数组分成两部分,每部分递归处理变成有序,将两个有序列表合并起来。

代码模板

n = int(input())
a = list(map(int, input().split()))

def merge(A,B):
    result = []
    while len(A)!=0 and len(B)!=0:
        if A[0] <= B[0]:
            result.append(A.pop(0))
        else:
            result.append(B.pop(0))
    result.extend(A)
    result.extend(B)
    return result

def mergesort(A):
    if len(A)<2:
        return A
    mid = len(A)//2
    left =mergesort(A[:mid])
    right = mergesort(A[mid:])
    return merge(left, right)

print(' '.join(map(str, mergesort(a))))

6.桶排序

算法步骤

利用函数映射关系,将输入数据分到有限的桶里,然后每个通分别排序:
(1)初始化k个桶
(2)遍历数据,将数据放入到对应桶中
(3)每个桶单独排序
(4)各个桶的数据拼接起来

代码模板

在这里插入图片描述

相关文章:

  • 第13章贪心算法
  • 深度学习框架PyTorch——从入门到精通(6.1)自动微分
  • [RH342]iscsi配置与排错
  • qt下载和安装教程国内源下载地址
  • 再学:call与delegatecall、call转账 Bank合约
  • 07-SDRAM控制器的设计——Sdram_Control.v代码解析
  • Git使用SSH登陆
  • synchronized的原理和锁升级
  • Ubuntu “文件系统根目录”上的磁盘空间不足
  • 数据结构篇——线索二叉树
  • 【R语言】lm线性回归及输出含义,置信区间,预测,R方,ggplot 拟合直线
  • Unity学习之Shader总结(一)
  • Ubuntu20.04安装Nvidia显卡驱动
  • Cursor与Blender-MCP生成3D模型
  • Spring Boot集成MyBatis与MySQL
  • linux du和df
  • Linux 快捷键 | 终端快捷键 / 键盘快捷键
  • 大模型如何赋能安全防御?威胁检测与漏洞挖掘的“AI革命”
  • Linux 命令行整理(完善中)
  • fastapi+angular实现菜鸟驿站系统
  • 解放日报:“北斗七星”列阵,AI群星闪耀
  • 山西太原小区爆炸事故已造成17人受伤
  • 打造沪派水乡的“湿意”,上海正在保护营造一批湿地空间
  • 从腰缠万贯到债台高筑、官司缠身:尼泊尔保皇新星即将陨落?
  • 第五届全国医院人文管理路演在昆山举办:患者体验才是温度计
  • 我国将出台稳就业稳经济推动高质量发展若干举措,将根据形势变化及时出台增量储备政策