我的第一個開源項目:排序算法的多種實現方式

排序算法 為例,展示如何在 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
英文地址,請注明出處:http://en.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生成末日…

針對軟件定義車載網絡的動態服務導向機制

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…