我的第一个开源项目:排序算法的多种实现方式

排序算法 为例,展示如何在 Python 中进行不同实现方式的对比

项目概述

本项目旨在通过 Python 实现几种经典的排序算法,并通过性能对比、代码注释和优化手段,为开源社区提供参考。选择排序、冒泡排序、快速排序和归并排序作为主要算法,实现它们的不同版本,并在文档中详细分析每个算法的时间复杂度、空间复杂度及其应用场景。


1. 项目结构

sorting_project/
│
├── README.md
├── main.py
├── sorting_algorithms/
│   ├── __init__.py
│   ├── bubble_sort.py
│   ├── quick_sort.py
│   ├── merge_sort.py
│   └── selection_sort.py
└── tests/└── test_sorting.py
  • main.py:运行排序算法的入口文件。

  • sorting_algorithms/:包含各种排序算法的 Python 文件。

  • tests/:用于测试排序算法正确性和性能的单元测试文件。


2. 算法实现

2.1 冒泡排序(Bubble Sort)

冒泡排序通过重复交换相邻的元素,直到整个列表有序。时间复杂度为 O(n2)O(n^2),空间复杂度为 O(1)O(1)。

# sorting_algorithms/bubble_sort.py
def bubble_sort(arr):n = len(arr)for i in range(n):swapped = Falsefor j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]swapped = Trueif not swapped:breakreturn arr
2.2 选择排序(Selection Sort)

选择排序每次从未排序部分选择最小元素,并将其放到已排序部分的末尾。时间复杂度为 O(n2)O(n^2),空间复杂度为 O(1)O(1)。

# sorting_algorithms/selection_sort.py
def selection_sort(arr):n = len(arr)for i in range(n):min_idx = ifor j in range(i+1, n):if arr[j] < arr[min_idx]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]return arr
2.3 快速排序(Quick Sort)

快速排序采用分治策略,通过选取一个枢轴元素,将数组分为两部分,然后递归排序。时间复杂度为 O(nlog⁡n)O(n \log n)(最优情况),但最坏情况为 O(n2)O(n^2),空间复杂度为 O(log⁡n)O(\log n)。

# sorting_algorithms/quick_sort.py
def quick_sort(arr):if len(arr) <= 1:return arrpivot = 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)
2.4 归并排序(Merge Sort)

归并排序也是分治法的一种,它通过递归将数组分割,直到每个子数组只有一个元素,然后合并这些子数组,最终得到排序好的数组。时间复杂度为 O(nlog⁡n)O(n \log n),空间复杂度为 O(n)O(n)。

# sorting_algorithms/merge_sort.py
def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result

3. 性能测试与对比

我们可以在 tests/test_sorting.py 文件中编写单元测试,验证各个排序算法的性能与准确性。

# tests/test_sorting.py
import random
import time
from sorting_algorithms.bubble_sort import bubble_sort
from sorting_algorithms.selection_sort import selection_sort
from sorting_algorithms.quick_sort import quick_sort
from sorting_algorithms.merge_sort import merge_sortdef test_sorting_algorithm(algorithm, arr):start_time = time.time()sorted_arr = algorithm(arr)end_time = time.time()assert sorted_arr == sorted(arr), f"Test failed for {algorithm.__name__}"print(f"{algorithm.__name__} took {end_time - start_time:.6f} seconds")if __name__ == "__main__":arr = random.sample(range(10000), 1000)  # Random list of 1000 integerstest_sorting_algorithm(bubble_sort, arr.copy())test_sorting_algorithm(selection_sort, arr.copy())test_sorting_algorithm(quick_sort, arr.copy())test_sorting_algorithm(merge_sort, arr.copy())

test_sorting.py 中,我们对不同的排序算法进行了性能测试。每个算法都执行一次,记录执行时间并验证结果是否正确。


4. 项目文档(README.md)

在项目的 README.md 文件中,可以描述项目的目标、算法实现的背景、如何使用代码以及如何贡献。

# Sorting Algorithms in PythonThis project implements several classic sorting algorithms in Python, including:- Bubble Sort
- Selection Sort
- Quick Sort
- Merge Sort## Installation1. Clone the repository```bashgit clone https://github.com/yourusername/sorting_project.git
  1. Install the required libraries (if any)

    pip install -r requirements.txt
    

看起来你已经有了一个很好的项目架构和代码实现!如果你需要进一步扩展这个项目,以下是一些优化和功能建议,帮助提升项目的复杂性和深度:


6. 功能扩展与优化建议

6.1 优化排序算法
  • 快速排序优化

    • 快速排序的性能在最坏情况下为 O(n2)O(n^2),通常在选择枢轴时如果数据已接近有序,就会导致效率低下。为了避免这种情况,你可以引入“三数取中”策略(选择数据的中位数作为枢轴),优化快速排序的性能。

    • 实现:

      def quick_sort(arr):if len(arr) <= 1:return arr# 使用三数取中的方法选择枢轴pivot = median_of_three(arr)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)def median_of_three(arr):first, middle, last = arr[0], arr[len(arr) // 2], arr[-1]return sorted([first, middle, last])[1]
      
  • 归并排序优化

    • 归并排序的空间复杂度为 O(n)O(n),为了降低空间消耗,可以在原地进行归并排序(非递归版本)。这一优化需要修改递归方式并将数组切割成小块进行合并。

    • 实现:

      def merge_sort_inplace(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort_inplace(arr[:mid])right = merge_sort_inplace(arr[mid:])return merge_inplace(left, right)def merge_inplace(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result
      
6.2 并行化处理
  • 并行化算法:对于大规模数据,单机多核的情况下可以通过并行化优化排序算法。对于归并排序和快速排序,考虑使用并行处理技术,利用Python中的concurrent.futures模块来并行处理数组切分部分。

    • 示例:快速排序并行化

      from concurrent.futures import ProcessPoolExecutordef parallel_quick_sort(arr):if len(arr) <= 1:return arrpivot = 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]with ProcessPoolExecutor() as executor:left_sorted, right_sorted = executor.map(parallel_quick_sort, [left, right])return left_sorted + middle + right_sorted
      
6.3 支持更多排序算法
  • 希尔排序(Shell Sort)

    • 这是一种基于插入排序的优化算法,通过通过使用增量序列来排序元素,可以大幅提高排序效率。

    • 实现

      def shell_sort(arr):n = len(arr)gap = n // 2while gap > 0:for i in range(gap, n):temp = arr[i]j = iwhile j >= gap and arr[j - gap] > temp:arr[j] = arr[j - gap]j -= gaparr[j] = tempgap //= 2return arr
      
  • 堆排序(Heap Sort)

    • 通过利用堆数据结构实现的排序算法,堆排序的时间复杂度为 O(nlog⁡n)O(n \log n),适用于大规模数据排序。

    • 实现

      def heapify(arr, n, i):largest = ileft = 2 * i + 1right = 2 * i + 2if left < n and arr[largest] < arr[left]:largest = leftif right < n and arr[largest] < arr[right]:largest = rightif largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)def heap_sort(arr):n = len(arr)for i in range(n // 2, -1, -1):heapify(arr, n, i)for i in range(n - 1, 0, -1):arr[i], arr[0] = arr[0], arr[i]heapify(arr, i, 0)return arr
      
6.4 增加更全面的测试覆盖
  • 单元测试优化

    • 增加更多边界情况和性能测试(如极限输入、大数据量、多次运行测试等)来保证算法的可靠性与稳定性。

    • 通过pytest框架可以高效地执行和组织测试:

      # tests/test_sorting.py
      import pytest
      from sorting_algorithms.bubble_sort import bubble_sortdef test_bubble_sort():assert bubble_sort([5, 3, 8, 6, 2]) == [2, 3, 5, 6, 8]assert bubble_sort([1]) == [1]assert bubble_sort([]) == []
      
  • 性能基准测试

    • 对不同规模的数据进行多轮性能对比,使用Python内置的timeit库来测量每个算法在不同数据集上的运行时间。

      import timeit
      setup = "from sorting_algorithms.bubble_sort import bubble_sort; arr = [5, 3, 8, 6, 2]"
      print(timeit.timeit("bubble_sort(arr)", setup=setup, number=1000))
      

7. 项目文档扩展(README.md)

在文档中,除了对每个排序算法进行描述,增加一个算法性能对比部分,提供每种算法在不同规模数据上的执行时间对比,帮助开源社区了解每个算法的优缺点。

# Sorting Algorithms in Python## OverviewThis project implements several classic sorting algorithms in Python, including:- Bubble Sort
- Selection Sort
- Quick Sort
- Merge Sort
- Shell Sort
- Heap Sort## Performance Comparison| Algorithm        | Data Size 1000 | Data Size 10000 | Data Size 100000 |
|------------------|----------------|-----------------|------------------|
| Bubble Sort      | 0.032s         | 3.12s           | 312.6s           |
| Quick Sort       | 0.002s         | 0.11s           | 1.05s            |
| Merge Sort       | 0.003s         | 0.12s           | 1.03s            |
| Heap Sort        | 0.004s         | 0.13s           | 1.10s            |## Installation1. Clone the repository```bashgit clone https://github.com/yourusername/sorting_project.git
  1. Install the required libraries

    pip install -r requirements.txt
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G-LEO - 用于 5g satellite 链接的 OpenAirInterface™ 扩展

目标&#xff1a;5G-LEO 旨在加速 OAI 作为开源工具的发展&#xff0c;允许卫星通信社区交流和比较 5G NTN 结果&#xff0c;并促进研发活动的合作。扩展的OAI软件库被视为开发早期原型的重要工具&#xff0c;用于验证关键的5G NTN设计方面&#xff0c;并为3GPP标准化过程提供及…

基于 Mybatis 框架*的完整开发流程与顺序

基于 MyBatis 框架 的完整开发流程与顺序一、环境准备阶段1. 新建 Maven 项目&#xff08;或普通 Java 项目&#xff09;作用&#xff1a;用 Maven 统一管理依赖&#xff0c;自动下载 MyBatis、MySQL 驱动等 Jar 包操作&#xff1a;IDE&#xff08;如 IDEA&#xff09;选 Maven…

机械学习--决策树(实战案例)

决策树分两种分类和回归&#xff0c;这篇博客我将对两种方法进行实战讲解一、分类决策树代码的核心任务是预测 “电信客户流失状态”&#xff0c;这是一个典型的分类任务数据集附在该博客上&#xff0c;可以直接下载代码整体结构整理代码主要分为以下几个部分&#xff1a;导入必…

SQL154 插入记录(一)

描述牛客后台会记录每个用户的试卷作答记录到exam_record表&#xff0c;现在有两个用户的作答记录详情如下&#xff1a;用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001&#xff0c;并在50分钟后提交&#xff0c;得了90分&#xff1b;用户1002在2021年9月4日上午7点1分…

BeanFactory 和 ApplicationContext 的区别?

口语化答案好的&#xff0c;面试官。BeanFactory和ApplicationContext都是用于管理Bean的容器接口。BeanFactory功能相对简单。提供了Bean的创建、获取和管理功能。默认采用延迟初始化&#xff0c;只有在第一次访问Bean时才会创建该Bean。因为功能较为基础&#xff0c;BeanFact…

VNC连接VirtualBox中的Ubuntu24.04 desktop图形化(GUI)界面

测试环境&#xff1a;VirtualBox 7,Ubuntu24.04 desktop,Ubuntu24.04 server(no desktop) 一、下载和安装dRealVNC viewer。 二、配置 VirtualBox 网络&#xff1a;NAT 模式 端口转发 1、打开 VirtualBox&#xff0c;选择您的 Ubuntu 虚拟机&#xff0c;点击 设置。 选择 网…

浮动路由和BFD配置

拓扑图 前期的拓扑图没有交换机配置步骤 1、配置IP地址 终端IP地址的配置 路由器IP地址的配置 配置router的对应接口的IP地址 <Huawei>sys [Huawei]sysname router [router]interface Ethernet 0/0/0 [router-Ethernet0/0/0]ip address 192.168.10.254 24 [router-Ethern…

Docker 实战 -- Nextcloud

文章目录前言1. 创建 docker-compose.yml2. 启动 Nextcloud3. 访问 Nextcloud4. 配置优化&#xff08;可选&#xff09;使用 PostgreSQL使用 redis添加 Cron 后台任务5. 常用命令6. 反向代理&#xff08;Nginx/Apache&#xff09;前言 当你迷茫的时候&#xff0c;请点击 Docke…

【计算机网络 | 第2篇】计算机网络概述(下)

文章目录七.因特网服务提供商&#x1f95d;八.接入网&#x1f95d;主流的家庭宽带接入方式介入网工作原理&#x1f9d0;DSL技术&#xff1a;铜线上的“三通道”通信DSL的速率标准呈现出显著的"不对称"特征&#x1f914;电缆互联网接入技术&#x1f34b;‍&#x1f7e…

SpringMVC 6+源码分析(四)DispatcherServlet实例化流程 3--(HandlerAdapter初始化)

一、概述 HandlerAdapter 是 Spring MVC 框架中的一个核心组件&#xff0c;它在 DispatcherServlet 和处理程序&#xff08;handler&#xff09;之间扮演适配器的角色。DispatcherServlet 接收到 HTTP 请求后&#xff0c;需要调用对应的 handler 来处理请求&#xff08;如控制器…

【lucene】FastVectorHighlighter案例

下面给出一套可直接拷贝运行的 Lucene 8.5.0 FastVectorHighlighter 完整示例&#xff08;JDK 8&#xff09;&#xff0c;演示从建索引、查询到高亮的全过程。 > 关键点&#xff1a;字段必须 1. 存储原始内容&#xff08;setStored(true)&#xff09; 2. 开启 TermVecto…

C++返回值优化(RVO):高效返回对象的艺术

在C开发中&#xff0c;按值返回对象的场景十分常见&#xff08;如运算符重载、工厂函数等&#xff09;&#xff0c;但开发者常因担忧“构造/析构的性能开销”而陷入纠结&#xff1a;该不该返回对象&#xff1f;如何避免额外成本&#xff1f;本文将剖析痛点、拆解错误思路&#…

用 PyTorch 实现一个简单的神经网络:从数据到预测

PyTorch 是目前最流行的深度学习框架之一&#xff0c;以其灵活性和易用性受到开发者的喜爱。本文将带你从零开始&#xff0c;用 PyTorch 实现一个简单的神经网络&#xff0c;用于解决经典的 MNIST 手写数字分类问题。我们将涵盖数据准备、模型构建、训练和预测的完整流程&#…

四级页表通俗讲解与实践(以 64 位 ARM Cortex-A 为例)

&#x1f4d6; &#x1f3a5; B 站博文精讲视频&#xff1a;点击链接&#xff0c;配合视频深度学习 四级页表通俗讲解与实践&#xff08;以 64 位 ARM Cortex-A 为例&#xff09; 本文面向希望彻底理解现代 64 位架构下四级页表的开发者&#xff0c;结合 ARM Cortex-A 系列处理…

AI模型整合包上线!一键部署ComfyUI,2.19TB模型全解析

最近体验了AIStarter平台上线的AI模型整合包&#xff0c;包含2.19TB ComfyUI大模型&#xff0c;整合市面主流模型&#xff0c;一键部署ComfyUI&#xff0c;省去重复下载烦恼&#xff01;以下是使用心得和部署步骤&#xff0c;适合AI开发者参考。工具亮点这款AI模型整合包由熊哥…

灰色优选模型及算法MATLAB代码

电子装备试验方案优选是一个典型的多属性决策问题&#xff0c;通常涉及指标复杂、信息不完整、数据量少且存在不确定性的特点。灰色系统理论&#xff08;Grey System Theory&#xff09;特别擅长处理“小样本、贫信息”的不确定性问题&#xff0c;因此非常适合用于此类方案的优…

AI框架工具FastRTC快速上手6——视频流案例之物体检测(下)

一 前言 上一篇,我们实现了用YOLO对图片上的物体进行检测,并在图片上框出具体的对象并打出标签。但只是应用在单张图片,且还没用上FastRTC。 本篇,我们希望结合FastRTC的能力,实现基于YOLO的实时视频流的物体检测。 本篇文字将不会太多。学习完本篇,对比前面的文章,你…

PHP常见中高面试题汇总

一、 PHP部分 1、PHP如何实现静态化 PHP的静态化分为&#xff1a;纯静态和伪静态。其中纯静态又分为&#xff1a;局部纯静态和全部纯静态。 PHP伪静态&#xff1a;利用Apache mod_rewrite实现URL重写的方法&#xff1b; PHP纯静态&#xff0c;就是生成HTML文件的方式&#xff0…

基于Java AI(人工智能)生成末日题材的实践

Java AI 生成《全球末日》文章的实例 使用Java结合AI技术生成《全球末日》题材的文章可以通过多种方式实现,包括调用预训练模型、使用自然语言处理库或结合生成式AI框架。以下是30个实例的生成方法和示例代码片段。 调用预训练模型(如GPT-3或GPT-4) 使用OpenAI API生成末日…

针对软件定义车载网络的动态服务导向机制

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…