首页 > 其他分享 >树排序

树排序

时间:2024-02-01 14:00:43浏览次数:17  
标签:__ sort None val self tree 排序

"""
树排序算法。

构建二叉搜索树,然后遍历它以获取排序后的列表。
"""
from __future__ import annotations

from collections.abc import Iterator
from dataclasses import dataclass


@dataclass
class Node:
    val: int
    left: Node | None = None
    right: Node | None = None

    def __iter__(self) -> Iterator[int]:
        if self.left:
            yield from self.left
        yield self.val
        if self.right:
            yield from self.right

    def __len__(self) -> int:
        return sum(1 for _ in self)

    def insert(self, val: int) -> None:
        if val < self.val:
            if self.left is None:
                self.left = Node(val)
            else:
                self.left.insert(val)
        elif val > self.val:
            if self.right is None:
                self.right = Node(val)
            else:
                self.right.insert(val)


def tree_sort(arr: list[int]) -> tuple[int, ...]:
    """
    >>> tree_sort([])
    ()
    >>> tree_sort((1,))
    (1,)
    >>> tree_sort((1, 2))
    (1, 2)
    >>> tree_sort([5, 2, 7])
    (2, 5, 7)
    >>> tree_sort((5, -4, 9, 2, 7))
    (-4, 2, 5, 7, 9)
    >>> tree_sort([5, 6, 1, -1, 4, 37, 2, 7])
    (-1, 1, 2, 4, 5, 6, 7, 37)

    # >>> tree_sort(range(10, -10, -1)) == tuple(sorted(range(10, -10, -1)))
    # True
    """
    if len(arr) == 0:
        return tuple(arr)
    
    # 创建根节点
    root = Node(arr[0])
    
    # 将其他元素插入到树中
    for item in arr[1:]:
        root.insert(item)
    
    # 返回排序后的元组
    return tuple(root)


if __name__ == "__main__":
    import doctest

    # 运行文档测试
    doctest.testmod()
    
    # 打印额外的测试结果
    print(f"{tree_sort([5, 6, 1, -1, 4, 37, -3, 7]) = }")

 

标签:__,sort,None,val,self,tree,排序
From: https://www.cnblogs.com/mlhelloworld/p/18001091

相关文章

  • unity中,连续路径上的点排序
    1///<summary>2///路径点排序3///</summary>4///<paramname="start">路径起点</param>5///<paramname="input">路径上所有的点</param>6///<paramnam......
  • 最多能完成排序的块
    769.MaxChunksToMakeSorted(Medium)数组arr是[0,1,...,arr.length-1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?示例1:输入:arr=[4,3,2,1,0]输......
  • 蒻苟的第一篇学习笔记(快速排序)
    快速排序是一个非常经典也非常常用的排序算法。在平均状况下,排序n个项目需要Ο(nlogn)次比较,在最坏状况下则需要Ο(n2)次比较,但这种状况其实并不常见。快速排序是分而治之思想在排序算法上的典型应用。算法步骤:1.从数列中挑出一个元素,称为"基准"。2。设置两个"哨兵",利用......
  • 深入浅出堆排序: 高效算法背后的原理与性能
    ......
  • 快速排序:高效分割与递归,排序领域的王者算法
    ......
  • 【学习笔记】排序
    选择排序选择排序是一种简单的排序算法。它的原理是每次找到数组中的最小值放到正确的位置。选择排序的最好、最坏、平均时间复杂度都是\(O(n^2)\),空间复杂度为\(O(1)\)。由于存在交换这一操作,选择排序是一个不稳定的排序算法。voidselectionSort(inta[],intn){ for(int......
  • 洛谷题单指南-排序-P1012 [NOIP1998 提高组] 拼数
    原题链接:https://www.luogu.com.cn/problem/P1012题意解读:通过某种合理的排序方式,使得排序后的数字连在一起最大。解题思路:此题关键在于排序,对于两个数字,哪个数字应该排在前面呢?1、思考误区很容易想到,给定两个数abcd、xyz,先比较第一位a和x,谁大谁排前面,一直到c和z。再来看d,这......
  • 洛谷题单指南-排序-P1104 生日
    原题链接:https://www.luogu.com.cn/problem/P1104题意解读:将学生按照年龄由大到小排序,如果年龄相同,后输入的排在前面,输出排序后的学生姓名。解题思路:此题是一个排序常规题,年龄大排在前说明年、月、日越小越在前面,核心的排序思路如下:1、如果年份不同,按年份由小到大排序2、如果......
  • 洛谷题单指南-排序-P5143 攀爬者
    原题链接:https://www.luogu.com.cn/problem/P5143题意解读:给出一系列的点,按某种顺序经过所有点,计算距离。解题思路:如果小学生,可能对于三维坐标距离有些陌生,没关系,题目已经给出了计算公式,直接套公式即可,关键步骤如下:1、读取所有坐标点2、按高度值从小到大排序3、从头依次计算......
  • 31-ArrayList和HashMap集合的排序
     扩展:在List集合中添加另一个集合时,一般常用两种方法booleanadd(Ee): 将list作为一个元素添加到集合中booleanaddAll(Collection<?extends E> c):把list中的所有元素添加到集合中 ArrayList类的排序方法(常用)packagelist;importjava.util.ArrayList......