Python实战开发及案例分析(7)—— 排序算法

        排序算法是计算机科学中的基础,用于将数据元素按照特定的顺序排列。Python 提供了多种方式来实现排序算法,包括内置的排序函数和手动实现各种经典排序算法。

Python 内置排序函数

Python 的内置函数 sorted() 和列表的 sort() 方法提供了高效的排序功能。这两种方法默认使用 Timsort 算法,这是一种结合了归并排序和插入排序的高效排序算法。

sorted() 函数

  sorted() 函数可以接受任何可迭代对象,并返回一个新的排好序的列表。

示例:排序一组数字和字符串

# 数字排序
numbers = [5, 2, 9, 1, 5, 6]
sorted_numbers = sorted(numbers)
print("Sorted numbers:", sorted_numbers)

# 字符串排序
words = ["banana", "apple", "cherry", "date"]
sorted_words = sorted(words)
print("Sorted words:", sorted_words)
列表的 sort() 方法

        与 sorted() 不同,sort() 方法会就地排序列表,不创建新的列表。

# 就地排序
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort()
print("Sorted numbers in-place:", numbers)

手动实现排序算法

        对于教学和理解排序算法的基本原理,手动实现经典排序算法是非常有用的。

插入排序

        插入排序是一种简单直观的比较排序算法,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

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

# 示例使用
arr = [12, 11, 13, 5, 6]
insertion_sort(arr)
print("Array sorted using insertion sort:", arr)
快速排序

        快速排序是一种高效的排序算法,采用分治法的策略,通过一个分区操作,将原数组分为两个子数组,左边子数组的元素都比右边子数组的元素小,然后递归地排序两个子数组。

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[len(arr) // 2]
        left = [x for x in arr if x < pivot]
        middle = [x for x in arr if x == pivot]
        right = [x for x in arr if x > pivot]
        return quick_sort(left) + middle + quick_sort(right)

# 示例使用
arr = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = quick_sort(arr)
print("Array sorted using quick sort:", sorted_arr)

结论

        排序算法是数据结构和算法学习的基础,对于优化数据处理和搜索算法非常重要。Python 的内置排序方法提供了高效和简单的解决方案,而手动实现这些算法则有助于深入理解其背后的原理和特点。在实际应用中,选择合适的排序算法可以根据具体需求进行,例如数据大小、数据结构的特性和所需的效率。通过这些示例,我们可以看到不同排序算法在处理相同数据时的效果和性能差异。

        继续探讨更多的排序算法,我们可以深入学习一些其他重要的经典排序算法,如归并排序和堆排序。这些算法在不同的应用场景中表现出了不同的性能优势,特别是在处理大规模数据集时。

归并排序

        归并排序是一种有效的排序算法,采用分治法的策略来实现。它将数组分割成两半,分别排序,然后将它们合并在一起。这种方法在最坏、平均和最佳情况下都提供 𝑂(𝑛log⁡𝑛)O(nlogn) 的时间复杂度。

Python 实现:        

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2  # 找到中间位置
        left_half = arr[:mid]
        right_half = arr[mid:]

        merge_sort(left_half)  # 对左半部分递归排序
        merge_sort(right_half)  # 对右半部分递归排序

        i = j = k = 0

        # 合并两半
        while i < len(left_half) and j < len(right_half):
            if left_half[i] < right_half[j]:
                arr[k] = left_half[i]
                i += 1
            else:
                arr[k] = right_half[j]
                j += 1
            k += 1

        # 检查是否有剩余
        while i < len(left_half):
            arr[k] = left_half[i]
            i += 1
            k += 1

        while j < len(right_half):
            arr[k] = right_half[j]
            j += 1
            k += 1

    return arr

# 示例使用
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("Array sorted using merge sort:", sorted_arr)

结论

        归并排序和堆排序提供了不同于简单排序算法(如插入排序或冒泡排序)的性能优势,尤其在处理大规模数据集时表现出更好的稳定性和效率。通过动手实现这些算法,不仅可以加深对其工作原理的理解,还可以提高解决实际排序问题的能力。在实际应用中,选择合适的排序算法可以根据数据的特性和所需的操作效率来决定。

        继续深入探讨更多高级排序算法,我们可以讨论希尔排序和计数排序。这些算法通过不同的策略来优化排序过程,适用于特定类型的数据集。

希尔排序

        希尔排序(也称为递减增量排序算法)是一种基于插入排序的算法。它首先排序间隔较远的元素,然后逐渐减少间隔距离。希尔排序比传统的插入排序更高效,因为它允许元素一次移动较远的距离。

Python 实现:

def shell_sort(arr):
    n = len(arr)
    gap = n // 2  # 初始间隔
    while gap > 0:
        for i in range(gap, n):
            temp = arr[i]
            j = i
            # 进行插入排序,将元素按间隔进行比较
            while j >= gap and arr[j - gap] > temp:
                arr[j] = arr[j - gap]
                j -= gap
            arr[j] = temp
        gap //= 2  # 减少间隔
    return arr

# 示例使用
arr = [35, 33, 42, 10, 14, 19, 27, 44]
sorted_arr = shell_sort(arr)
print("Array sorted using shell sort:", sorted_arr)

计数排序

        计数排序是一种非基于比较的排序算法,适用于一定范围内的整数排序。它计算每个元素的出现次数,然后根据元素的计数来放置元素在其正确位置。计数排序是一个线性时间复杂度的排序算法,当输入的元素是 n 个在一定范围内的整数时,它非常高效。

Python 实现:

def counting_sort(arr, max_val):
    n = len(arr)
    count = [0] * (max_val + 1)  # 计数数组
    output = [0] * n  # 输出数组

    # 存储每个元素的计数
    for num in arr:
        count[num] += 1

    # 计数数组变形,后面的元素等于前面的元素之和
    for i in range(1, max_val + 1):
        count[i] += count[i - 1]

    # 反向填充目标数组,保持排序的稳定性
    for i in range(n - 1, -1, -1):
        output[count[arr[i]] - 1] = arr[i]
        count[arr[i]] -= 1

    return output

# 示例使用
arr = [4, 2, 2, 8, 3, 3, 1]
max_val = max(arr)  # 找到最大值
sorted_arr = counting_sort(arr, max_val)
print("Array sorted using counting sort:", sorted_arr)

结论

        希尔排序和计数排序提供了不同的方法来处理排序问题。希尔排序通过分组和逐步细化的插入排序加快排序过程,而计数排序则完全脱离了比较排序的范畴,通过计算元素的出现频率来实现排序。这些算法在适当的场景下使用可以显著提高排序效率,如希尔排序适合中等大小的数组,而计数排序适用于有明确范围的整数数组。在实际选择排序算法时,了解数据的性质和需求是非常关键的,以确保算法的效率和适用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/593028.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

构建智能化监控追踪系统:架构设计与实践

随着信息技术的不断发展&#xff0c;监控追踪系统在各个领域的应用越来越广泛。本文将探讨监控追踪系统的架构设计&#xff0c;介绍其关键特点和最佳实践&#xff0c;助力各行业实现智能化监控与管理。 1. **需求分析与功能设计&#xff1a;** 在设计监控追踪系统之前&#xf…

Microsoft 365 for Mac(Office 365)v16.84正式激活版

office 365 for mac包括Word、Excel、PowerPoint、Outlook、OneNote、OneDrive和Teams的更新。Office提供了跨应用程序的功能&#xff0c;帮助用户在更短的时间内创建令人惊叹的内容&#xff0c;您可以在这里创作、沟通、协作并完成重要工作。 Microsoft 365 for Mac(Office 36…

HTML/CSS1

1.前置说明 请点这里 2.img元素 格式&#xff1a; <img src"图片地址" alt"占位文字" width"图片宽度" height"图片高度">其中alt是当图片加载失败时显示的文字 而且不同内核的浏览器显示出来的占位文字的效果也是不尽相同的…

K8S哲学 - 资源调度 HPA (horizontal pod autoScaler-sync-period)

kubectl exec&#xff1a; kubectl exec -it pod-name -c container-name -- /bin/sh kubectl run 通过一个 deployment来 演示 apiVersion: apps/v1 kind: Deployment metadata:name: deploylabels: app: deploy spec: replicas: 1selector: matchLabels:app: deploy-podt…

加州大学欧文分校英语中级语法专项课程04:Intermediate Grammar Project学习笔记(完结)

Intermediate Grammar Project Course Certificate Specialization Certificate Specialization Intro Course Intro 本文是学习 Coursera: Intermediate Grammar Project 这门课的学习笔记。 文章目录 Intermediate Grammar ProjectWeek 01: IntroductionCapstone Introducti…

解密中国首个“音乐版Sora” | 最新快讯

编辑部发自 AIGC 峰会 量子位公众号 QbitAI 文生图、文生音频、文生视频、AI 搜索引擎……大模型在多模态的进程可谓是愈演愈烈。 而聚焦在国内&#xff0c;有这么一家公司在 AIGC 大热潮的前后&#xff0c;单是“首个”就占了四席&#xff1a; 发布中国首个开源文本大模型国内…

基于OpenCv的图像全景拼接

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计6757字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

【数据结构(十)】Map和Set

❣博主主页: 33的博客❣ ▶️文章专栏分类:数据结构◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.搜索树2.1 概念2.2实现二叉搜索树 2.4性能分析3.搜索3.Map3.1Map说明3.2 M…

vue3使用el-autocomplete请求远程数据

服务器端 RestController RequestMapping("/teacher") public class TeacherController {Resourceprivate TeacherService teacherService;GetMapping({"/v1/getTop10TeacherByName/","/v1/getTop10TeacherByName/{name}"})public ResultBean&l…

论文笔记:(Security 22) 关于“二进制函数相似性检测”的调研

个人博客链接 注&#xff1a;部分内容参考自GPT生成的内容 [Security 22] 关于”二进制函数相似性检测“的调研&#xff08;个人阅读笔记&#xff09; 论文&#xff1a;《How Machine Learning Is Solving the Binary Function Similarity Problem》&#xff08;Usenix Securi…

C++多态特性详解

目录 概念&#xff1a; 定义及实现&#xff1a; 虚函数重写的两个例外&#xff1a; 1.协变&#xff1a; 2.析构函数的重写&#xff1a; final关键字&#xff1a; override关键字&#xff1a; 多态是如何实现的&#xff08;底层&#xff09;&#xff1a; 面试题&#xff1…

图像识别及分类

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

【网络编程下】五种网络IO模型

目录 前言 一.I/O基本概念 1.同步和异步 2.阻塞和非阻塞 二.五种网络I/O模型 1.阻塞I/O模型 2.非阻塞式I/O模型 ​编辑 3.多路复用 4.信号驱动式I/O模型 5. 异步I/O模型 三.五种I/O模型比较​编辑 六.I/O代码示例 1. 阻塞IO 2.非阻塞I/O 3.多路复用 (1)select …

Rust web简单实战

一、使用async搭建简单的web服务 1、修改cargo.toml文件添加依赖 [dependencies] futures "0.3" tokio { version "1", features ["full"] } [dependencies.async-std] version "1.6" features ["attributes"]2、搭…

【Leetcode每日一题】 综合练习 - 全排列 II(难度⭐⭐)(71)

1. 题目解析 题目链接&#xff1a;47. 全排列 II 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路梳理 为了生成给定数组nums的全排列&#xff0c;同时避免由于重复元素导致的重复排列&#xff0c;我们可以遵…

刷代码随想录有感(56):二叉搜索树的最小绝对差

题干&#xff1a; 代码:中序遍历成有序数组逐一比较相邻两个数之间的差值&#xff0c;注意这里是取最小值所以定义的初始值应该是非常大的INT_MAX&#xff01;&#xff01;&#xff01; class Solution { public:void traversal(TreeNode* root, vector<int>&a){if(…

OpenCV 为轮廓创建边界框和圆(62)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV检测凸包(61) 下一篇 :OpenCV如何为等值线创建边界旋转框和椭圆(62) ​ 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::boundingRect使用 OpenCV 函数 cv::mi…

c++多线程2小时速成

简介 c多线程基础需要掌握这三个标准库的使用&#xff1a;std::thread,std::mutex, andstd::async。 1. Hello, world #include <iostream> #include <thread>void hello() { std::cout << "Hello Concurrent World!\n"; }int main() {std::th…

轻松应对数据恢复挑战:雷神笔记本,不同情况不同策略

在数字化时代&#xff0c;数据无疑是我们生活中不可或缺的一部分。无论是重要的工作文件、珍贵的家庭照片&#xff0c;还是回忆满满的视频&#xff0c;一旦丢失&#xff0c;都可能给我们的生活带来诸多不便。雷神笔记本作为市场上备受欢迎的电脑品牌&#xff0c;用户在使用过程…

ubuntu使用Remmina远程连接Windows桌面

概况 目的&#xff1a; 远程连接公司电脑写一点代码 之前的方案&#xff1a; 安装Win10虚拟机&#xff0c;虚拟机里连接 VPN&#xff0c; 然后用 mstsc 命令连接。 新的方案&#xff1a;连接VPN后&#xff0c; 开启Remmina直接连接远程 Windows 桌面 新方案优点&#xff1a…
最新文章