数据结构与算法之手撕排序算法

yizhihongxing

数据结构与算法之手撕排序算法

本篇攻略介绍如何手撕常见的排序算法。

冒泡排序

冒泡排序是一种通过不断交换相邻元素来排序的方法。它的时间复杂度为$O(n^2)$。

def bubble_sort(nums):
    for i in range(len(nums)):
        for j in range(len(nums)-i-1):
            if nums[j] > nums[j+1]:
                nums[j], nums[j+1] = nums[j+1], nums[j]
    return nums

示例1:

>>> nums = [5, 2, 8, 4, 9, 1]
>>> bubble_sort(nums)
[1, 2, 4, 5, 8, 9]

示例2:

>>> nums = [7, 3, 6, 1, 9]
>>> bubble_sort(nums)
[1, 3, 6, 7, 9]

选择排序

选择排序是一种每次找最小元素并放到已排序数组末尾的方法。它的时间复杂度为$O(n^2)$。

def selection_sort(nums):
    for i in range(len(nums)):
        min_idx = i
        for j in range(i+1, len(nums)):
            if nums[j] < nums[min_idx]:
                min_idx = j
        nums[i], nums[min_idx] = nums[min_idx], nums[i]
    return nums

示例1:

>>> nums = [5, 2, 8, 4, 9, 1]
>>> selection_sort(nums)
[1, 2, 4, 5, 8, 9]

示例2:

>>> nums = [7, 3, 6, 1, 9]
>>> selection_sort(nums)
[1, 3, 6, 7, 9]

插入排序

插入排序是一种将未排序段元素逐个插入已排序段的方法。它的时间复杂度为$O(n^2)$。

def insertion_sort(nums):
    for i in range(1, len(nums)):
        temp = nums[i]
        j = i-1
        while j >= 0 and nums[j] > temp:
            nums[j+1] = nums[j]
            j -= 1
        nums[j+1] = temp
    return nums

示例1:

>>> nums = [5, 2, 8, 4, 9, 1]
>>> insertion_sort(nums)
[1, 2, 4, 5, 8, 9]

示例2:

>>> nums = [7, 3, 6, 1, 9]
>>> insertion_sort(nums)
[1, 3, 6, 7, 9]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数据结构与算法之手撕排序算法 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言 超详细总结讲解二叉树的概念与使用

    C语言 超详细总结讲解二叉树的概念与使用 1. 什么是二叉树? 二叉树是一种树状数据结构,其中每个节点最多有两个子节点,被称为左子节点和右子节点。具有以下几个特点: 每个节点最多有两个子节点; 左子节点可以为空,右子节点也可以为空; 二叉树的每个节点最多有一个父节点; 二叉树通常定义为递归模式定义,即每个节点都可以看做一棵新的二叉树。 2. 二叉树的遍历方式…

    数据结构 2023年5月17日
    00
  • Java实题演练二叉搜索树与双向链表分析

    Java实题演练二叉搜索树与双向链表分析 题目描述 给定一个二叉搜索树,将它转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 思路分析 对于一颗二叉搜索树,有以下性质: 若左子树不为空,则左子树上所有结点的值均小于它的根结点的值; 若右子树不为空,则右子树上所有结点的值均大于它的根结点的值; 左右子树也为二叉搜索树。 我们考虑…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划

    DAY4共2题: 树(组合数学) 子序列(dp,数学) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/109…

    算法与数据结构 2023年4月18日
    00
  • 考研数据结构模板:顺序表、链表、栈、队列

    考研数据结构模板:顺序表、链表、栈、队列 前言 代码风格偏向于考研风格而非算法竞赛风格。 代码实现参考《2024数据结构王道复习指导》。 注释详细、保证看懂。 下面是已实现的数据结构模板: 顺序表SeqList 链表LinkList 双链表DLinkList 顺序栈SeqStack 循环顺序队列CircleQueue 链队列LinkQueue 顺序表SeqL…

    算法与数据结构 2023年4月17日
    00
  • C语言 数据结构链表的实例(十九种操作)

    C语言 数据结构链表的实例(十九种操作)攻略 简介 链表是一种动态数据结构,以链式存储方式让任意节点之间相互连接,链表中的每个节点包含两个部分:数据域和指针域,数据域存储节点的数据,指针域存储下一个节点的地址。链表的优点是可以动态地分配内存,其缺点是查询效率较低。 本攻略将介绍19种链表操作,其中包括创建链表、添加节点、删除节点、查找节点以及遍历链表等操作。…

    数据结构 2023年5月17日
    00
  • 解析Facebook的数据库查询引擎Presto在美团的应用

    解析Facebook的数据库查询引擎Presto在美团的应用 什么是Presto? Presto是一个面向分布式查询的数据引擎,由Facebook开发并开源。它支持SQL查询,可以在不同类型的数据源中查询数据(如Hadoop HDFS、Hive等),具有快速、可扩展、灵活等特点。 Presto在美团的应用 美团使用Presto来进行大数据分析,帮助其优化运营…

    数据结构 2023年5月17日
    00
  • C#常用数据结构和算法总结

    C#常用数据结构和算法总结 数据结构 数组(Array) 数组是一种线性数据结构,它可以在内存中连续地存储相同类型的数据。可以使用索引访问数组中的元素。数组的元素可以是任意类型。 在 C# 中,定义一个数组需要指定数组的类型和数组的大小。例如,定义一个包含 5 个整数的数组: int[] arr = new int[5]; 链表(LinkedList) 链表…

    数据结构 2023年5月17日
    00
  • Java数据结构之双端链表原理与实现方法

    Java数据结构之双端链表原理与实现方法 一、什么是双端链表? 双端链表是一种链式数据结构,它每个节点都有两个指针:一个指向前一个节点,一个指向后一个节点。它具有链表的所有特点,而且还有一些独特的优点:对于一个双向链表,我们可以从头到尾遍历,也可以从尾到头遍历。在某些情况下,它比单向链表更有用,因为它可以执行逆序遍历。 二、双端链表的原理 双端链表由节点构成…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部