數據結構——排序(升級篇:快速排序、堆排序、希爾排序、計數排序)

1. 快速排序(Quick Sort)

原理

  • 選擇一個基準值(pivot)
  • 將數組分成兩部分:小于 pivot 的放左邊,大于 pivot 的放右邊。然后遞歸處理

工作過程示例

示例數組:[5, 3, 8, 4, 2]

  • 選擇 pivot = 8
    左:[5, 3, 4, 2],中:[8],右:[]
  • 遞歸左部分 pivot = 4
    左:[3, 2],中:[4],右:[5]
  • 遞歸 [3, 2] pivot = 2
    左:[],中:[2],右:[3]
  • 合并結果[] + [2] + [3][2, 3]
  • 逐步合并
    [2, 3] + [4] + [5][2, 3, 4, 5]
    [2, 3, 4, 5] + [8][2, 3, 4, 5, 8]

代碼

def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]  # 選中間值left = [x for x in arr if x < pivot] # 左邊mid = [x for x in arr if x == pivot] # 中間right = [x for x in arr if x > pivot] # 右邊return quick_sort(left) + mid + quick_sort(right)print(quick_sort([5, 3, 8, 4, 2]))

2. 堆排序(Heap Sort)

原理

  • 構建最大堆(堆頂是最大元素)
  • 將堆頂與末尾交換,縮小堆的范圍
  • 重新堆化,直到數組有序

工作過程示例
示例數組:[5, 3, 8, 4, 2]

  • 建最大堆[8, 4, 5, 3, 2](堆頂是最大值 8)
  • 交換堆頂與末尾[2, 4, 5, 3, 8],縮小堆范圍
  • 堆化[5, 4, 2, 3, 8]
  • 交換堆頂與末尾[3, 4, 2, 5, 8]
  • 堆化[4, 3, 2, 5, 8]
  • 交換堆頂與末尾[2, 3, 4, 5, 8]
  • 完成排序:[2, 3, 4, 5, 8]

代碼

def heapify(arr, n, i):largest = il, r = 2*i + 1, 2*i + 2if l < n and arr[l] > arr[largest]:largest = lif r < n and arr[r] > arr[largest]:largest = rif 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, -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 arrprint(heap_sort([5, 3, 8, 4, 2]))

3. 歸并排序(Merge Sort)

原理

  • 遞歸將數組拆分成左右兩半
  • 分別排序后,合并兩個有序數組
  • 典型的分治算法,穩定

工作過程示例
示例數組:[5, 3, 8, 4, 2]

  • 拆分:
    [5, 3, 8][4, 2]
    [5, 3][8][5] [3] [8]
    [4] [2]
  • 合并(按順序):
    [5] + [3][3, 5]
    [4] + [2][2, 4]
  • 合并 [3, 5][8][3, 5, 8]
  • 合并 [3, 5, 8][2, 4][2, 3, 4, 5, 8]

代碼

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):res = []i = j = 0while i < len(left) and j < len(right):if left[i] <= right[j]:res.append(left[i])i += 1else:res.append(right[j])j += 1res.extend(left[i:])res.extend(right[j:])return resprint(merge_sort([5, 3, 8, 4, 2]))

4. 希爾排序(Shell Sort)

原理

  • 插入排序的改進版
  • 先分成間隔為 gap 的多個子序列,對每個子序列做插入排序
  • 逐步縮小 gap,直到 gap=1 時完成排序

工作過程示例

示例數組:[5, 3, 8, 4, 2]

  • gap = 2(分組做插入排序)
    組1: [5, 8, 2][2, 8, 5]
    組2: [3, 4][3, 4]
    排序結果:[2, 3, 8, 4, 5]
  • gap = 1(普通插入排序)
    [2, 3, 4, 5, 8] → 完成

代碼

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 arrprint(shell_sort([5, 3, 8, 4, 2]))

5. 計數排序(Counting Sort)

原理

  • 適用于整數且范圍不大的情況
  • 統計每個值出現的次數
  • 按次數依次回填到數組中

工作過程示例

示例數組:[5, 3, 8, 4, 2]

  • 找范圍:min=2,max=8
  • 計數數組(索引表示值-2):
    值:2 3 4 5 6 7 8
    次數:[1,1,1,1,0,0,1]
  • 回填
    輸出 [2, 3, 4, 5, 8]

代碼

def counting_sort(arr):if not arr:return arrmin_val, max_val = min(arr), max(arr)count = [0] * (max_val - min_val + 1)for num in arr:count[num - min_val] += 1res = []for i, c in enumerate(count):res.extend([i + min_val] * c)return resprint(counting_sort([5, 3, 8, 4, 2]))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95520.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++:淺嘗gdb

hp window11 wsl ubuntu what is gdb&#xff1f; GNU調試器&#xff08;英語&#xff1a;GNU Debugger&#xff0c;縮寫&#xff1a;GDB&#xff09;&#xff0c;是GNU軟件系統中的標準調試器&#xff0c;此外GDB也是個具有移攜性的調試器&#xff0c;經過移攜需求的調修與…

Android輸入法一些常用的命令

Android開發過程可能會遇到Android輸入法異常的問題&#xff0c;可以通過如下命令來查看和修改系統的輸入法。方便調試。 獲取當下系統的所有輸入法 adb shell ime list獲取當前的可用輸入法 adb shell ime list -s獲取當前的輸入法 adb shell settings get secure default_inp…

Sklearn 機器學習 手寫數字識別 加載并查看數據

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Sklearn 機器學習 手寫數字識別:加載并查看數據 在機器學習入門案例中,手寫數字識別…

衛星通信鏈路預算之七:上行載噪比計算

在前面的文章中我們介紹了衛星通信鏈路計算的基礎知識&#xff0c;包括&#xff1a; 信噪比分配&#xff1b; 帶寬和功帶平衡原則&#xff1b; EIRP和G/T&#xff1b; 輸入回退&#xff1b; 輸入飽和通量密度SFD&#xff1b; 輸出回退&#xff1b; 這次我們正式進入正題…

一文讀懂PDB格式

最近在做分子對接和分子模擬&#xff0c;涉及到了一些盲區&#xff0c;必去pdb文件是按照列位數儲存信息的&#xff0c;跟其他文件的空格或者制表符分割很不同&#xff0c;所以也可能出現一些錯誤&#xff0c;比如信息錯位&#xff0c;因此有必要了深入解下結構相關的格式pdb、…

進階:PGCE中級專家認證精要

PGCE中級認證的核心價值技術深度&#xff1a;掌控未來生態PostgreSQL不僅是傳統關系型數據庫的標桿&#xff0c;更是云原生、AI大模型訓練、物聯網平臺等前沿場景的核心支撐。通過PGCE認證&#xff0c;你將掌握&#xff1a;萬億級數據性能調優&#xff1a;從查詢優化器原理到執…

AI增強SEO關鍵詞表現

內容概要 隨著人工智能技術的不斷演進&#xff0c;其在搜索引擎優化領域展現出顯著潛力&#xff0c;尤其在關鍵詞表現優化方面發揮著核心作用。本文將從基礎概念入手&#xff0c;系統探討AI如何智能提升關鍵詞的搜索可見性、流量吸引力和轉化效率&#xff0c;從而驅動整體SEO策…

PG靶機 - PayDay

一、 初步偵察與服務探測 1.1 端口掃描與服務識別 首先&#xff0c;對目標主機 192.168.163.39 進行一次全面的端口掃描&#xff0c;以識別其上運行的各項服務。 sudo nmap 192.168.163.39 -p- --min-rate5000 -A圖 1: Nmap 掃描結果&#xff0c;顯示開放 80、445 和 995 等端口…

MySQLl中OFFSET 的使用方法

MySQLl中OFFSET 的使用方法基本語法SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET offset_value;number_of_rows&#xff1a;指定返回的記錄數量。offset_value&#xff1a;從第幾條記錄開始返回&#xff08;偏移量從 0 開始計數&#xff09;。示…

監管科技(RegTech)應用:技術驅動的合規革命

目錄 監管科技(RegTech)應用:技術驅動的合規革命 1. 監管科技革命:數字化合規新范式 2. 技術架構全景 2.1 現代RegTech架構 2.2 合規效率公式 3. 核心技術實現 3.1 智能合約自動化合規 3.2 AI驅動的風險監測引擎 4. 核心應用場景 4.1 KYC/AML全流程自動化 4.2 實時交易監控系…

解決SQL Server連接失敗:Connection refused: connect

今天創建數據庫&#xff0c;本地連接SQL Server報錯&#xff1a;“通過端口 1433 連接到主機 127.0.0.1 的 TCP/IP 連接失敗。錯誤&#xff1a;Connection refused: connect”報錯圖如下&#xff1a;查了一圈&#xff0c;問題出在&#xff1a;TCP/IP 沒啟用。如果問題和我一樣&…

Windows bypassUAC 提權技法詳解(一)

引言 用戶賬戶控制&#xff08;User Account Control, 簡稱 UAC&#xff09;是微軟自 Windows Vista 起引入的一項安全功能&#xff0c;旨在通過要求用戶在執行需要管理員權限的操作時進行確認&#xff0c;從而防止未經授權的系統更改。UAC 的設計初衷是提高系統安全性&#xf…

OpenCV ------圖像基礎處理(一)

在 OpenCV 的圖像處理世界中&#xff0c;除了圖像邊框處理&#xff0c;還有一些基礎且重要的函數和運算&#xff0c;它們在圖像編輯、融合等場景中發揮著關鍵作用。下面我們就來詳細介紹cv2.copyMakeBorder()函數的具體參數與作用&#xff0c;以及圖像加法運算和加權運算的相關…

Unity寶箱隨機事件實現指南

目錄 前言 一、簡單的使用 新增ChestInteractableEvents&#xff0c;定義寶箱交互事件 新增Box 箱子掛載腳本&#xff0c;配置事件 運行效果 二、完善各種事件 1. 完善生成金幣事件 效果&#xff0c;金幣飛出 2. 完善生成敵人事件敵人 效果 3. 完善生成藥水事件 效…

從單機到分布式:用飛算JavaAI構建可擴展的TCP多人聊天系統

1. 引言&#xff1a;飛算JavaAI與實時通信技術的融合 1.1 為什么需要TCP多人聊天室&#xff1f; 在即時通訊領域&#xff0c;基于TCP協議的聊天室是理解網絡編程核心概念的經典案例&#xff0c;其技術價值體現在&#xff1a; 底層協議控制&#xff1a;直接操作Socket實現可靠數…

用 mock 把 ES 單元測試@elastic/elasticsearch-mock 上手

一、為什么“單元測 ES”這么別扭&#xff1f; 測試 ES 代碼時&#xff0c;最直覺的做法是連真集群做集成測試&#xff08;Docker 起個 ES&#xff09;&#xff0c;但&#xff1a; 啟動 & 數據裝填慢&#xff0c;不利于并行&#xff1b;網絡/磁盤抖動影響穩定性&#xff1b…

《嵌入式Linux應用編程(三):Linux文件IO系統調用深度解析》

今日學習內容1. 文件IO與標準IO核心對比特性標準IO文件IO實現層C標準庫Linux內核系統調用緩沖機制全緩沖/行緩沖無緩沖&#xff08;實時讀寫&#xff09;操作對象FILE*流指針整型文件描述符&#xff08;fd&#xff09;移植性跨平臺兼容Linux特有典型應用場景普通文件操作硬件設…

數據結構之順序表相關算法題

目錄一、移除元素二、刪除有序數組中的重復項三、合并兩個有序數組總結一、移除元素 移除元素 - 力扣 思路一&#xff1a;就是創建一個臨時數組&#xff0c;對原數組進行遍歷&#xff0c;找出與val不同的數據放到新數組里&#xff0c;然后再將tmp中的數據導回原數組 這個思…

百勝軟件×華為云聯合賦能,“超級國民品牌”海瀾之家新零售加速前行

報道顯示&#xff0c;早在2012年海瀾之家就開始布局數字化征程&#xff0c;并于近年對公司全流程信息化進行綜合重構升級優化&#xff0c;在采銷協同、業財一體等方面突破原有架構&#xff0c;通過信息化架構的增強為業務發展提供支撐。作為新零售重要組成部分的海瀾電商信息化…

“Zen 5”: The AMD High-Performance 4nm x86-64 Microprocessor Core

Codenamed “Zen 5,” AMD’s next-generation, energy-efficient high-performance x86 core targets a wide array of client, server, and embedded markets. Fabricated in TSMC’s 4nm FinFET process, the 55mm2 core complex (CCX), shown in Fig. 2.1.1., contains 8.6…