數據結構-4(常用排序算法、二分查找)

一、思維導圖

二、冒泡排序

def bubble_sort(ls):"""用i循環,逐步比較相鄰元素,直到循環結束,停止交換,就像一個個氣泡從下往上冒泡,每一次的循環結果都是最大的元素到了后面已排序序列的列首。"""j = 0  # 用于確定循環次數,同時用于下面排除已排序序列while j < len(ls):i = 0  # 用于遍歷未排序序列while i < len(ls) - 1 - j:  # -j排除已排序序列# 兩兩比較if ls[i] > ls[i + 1]:ls[i], ls[i + 1] = ls[i + 1], ls[i]i += 1j += 1

三、選擇排序

def selection_sort(ls):"""選擇排序逐步找到每個最小元素依次放入前面已排序列列尾"""i = 0  # 用于確定遍歷次數,也可理解為已排好序的元素后的第一個位置while i < len(ls) - 1:m = i  # 用于存放下標最小值,每次循環前需要重置為i,一次循環結束后交換m和j的位置j = i + 1  # 用于 遍歷i后面的所有元素與i對比,同時把遍歷到的最小值賦值給m,# 遍歷j用于尋找最小的元素并用m標記while j < len(ls):if ls[j] < ls[m]:m = jj += 1if m != i:  # 避免無意義的交換ls[i], ls[m] = ls[m], ls[i]  # 將尋找到的最小元素交換到最前面i += 1

四、直接插入排序

def insertion_sort(ls):"""直接插入排序"""i = 1  # 記錄待排序列中的第一個元素,從1開始是因為第一步只插入了一個元素沒必要排序while i < len(ls):temp = ls[i]  # 用于保存當前元素的值j = i  # j用于向前遍歷,逐步與temp比較,若j-1大于temp直接右移j-1,最后當j-1<=temp,空出來的位置填入temp# j<0表示只有一個元素時不必排序while temp < ls[j - 1] and j > 0:ls[j] = ls[j - 1]j -= 1ls[j] = tempi += 1

五、快速排序


def quick_sort_part(ls, L, R):"""快速排序"""# 定義基準P = ls[L]while R > L:while ls[R] >= P and R > L:  # R和L是會變化的,所以內循環也要檢查 R 是否 > LR -= 1ls[L] = ls[R]  # 比基準小的數據放在左邊while ls[L] <= P and R > L:L += 1ls[R] = ls[L]  # 比基準大的數據放在右邊# 當L=R說明只剩最后一個元素,把P填進去ls[L] = P  # or ls[R] = Preturn R  # 返回當前基準,也可以return Ldef quick_sort(ls, L, R):"""快速排序"""if R > L:  # 只有當不止一個元素時才進行快排# 進行第一次快排P_index = quick_sort_part(ls, L, R)# 遞歸,直到R>L# 對基準左邊的進行快排quick_sort(ls, L, P_index - 1)  # 此處遞歸結束表示第一次快排之后的左邊部分已經排序完畢。# 對基準右邊的進行快排quick_sort(ls, P_index + 1, R)  # 此處遞歸結束表示第一次快排之后的右邊部分已經排序完畢。

六、希爾排序

def shell_sort(ls):""""""n = len(ls)  # ls的長度gap = n // 2  # 初始化gap# 確定外層循環次數while gap > 0:for i in range(gap, n):  # 從與第一個元素相隔gap的元素開始遍歷j = i  # 不能改變外循環的i,需要創建一個j用于比較while j >= gap and ls[j] < ls[j - gap]:  # j>=gap 判斷 j-gap 是否會越界。ls[j]<ls[j-gap] 判斷是否需要交換ls[j - gap], ls[j] = ls[j], ls[j - gap]  # 交換j -= gap  # 讓當前元素繼續向前跳躍 gap 步,去和更前面的同組元素比較,直到它到達正確的插入位置。# 更新步長gap = gap // 2

七、歸并排序

# 定義歸并排序算法
def merge_sort(alist):"""歸并排序"""# 如果列表的元素個數小于等于1 直接返回if len(alist) <= 1:return alist# 將列表從中間分割成兩半mid = len(alist) // 2left_half = alist[:mid]right_half = alist[mid:]# 分別 遞歸 將左右兩部分再次進行分割兩半"""遞歸流程: 直到滿足if len(alist) <= 1:之前會一直遞歸,無法執行到merge函數,滿足if len(alist) <= 1:,之后left_half和right_half會被賦值,兩個都是只有一個元素的列表此時才能執行到合并函數merge,執行完之后會向遞歸的上一層的left_half或right_half返回合并后的列表,此時的left_half和right_half的某一個或者全部會變成兩個元素的列表然后回再次執行合并函數merge,直到整個遞歸流程結束,left_half和right_half為最初分開的兩半,最后執行合并函數即完成整體合并"""left_half = merge_sort(left_half)right_half = merge_sort(right_half)# 合并左右兩部分的序列return merge(left_half,right_half)  # 合并# 定義合并的算法
def merge(left,right):"""用于merge_sort遞歸合并的簡單的合并并排序算法"""# 將排序好的額元素放入空列表中arr = []i=0 # 遍歷左邊列表中的每個元素j=0 # 遍歷右邊列表中的每個元素#比較兩個列表中的元素 將小的元素先放入arr空列表中while i<len(left) and j<len(right):if left[i] < right[j]:arr.append(left[i])i+=1else:arr.append(right[j])j+=1# 如果右邊列表由剩余元素 將它直接插入列表中while j<len(right):arr.append(right[j])j+=1# 如果左邊列表由剩余元素 將它直接插入列表中while i < len(left):arr.append(left[i])i += 1return arr

八、二分查找

def binary_search_iter(arr, target):"""在 有序 升序 數組 arr 中查找 target。返回其索引;若不存在返回 -1。"""left, right = 0, len(arr) - 1  # 閉區間 [left, right]while left <= right:  # 區間非空mid = (left + right) // 2if arr[mid] == target:return midelif arr[mid] < target:left = mid + 1  # 去右半邊else:right = mid - 1  # 去左半邊return -1ls = [1, 2, 5, 7, 9, 11, 13, 17, 19, 20]
print(binary_search_iter(ls, 9))

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

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

相關文章

策略模式(Strategy Pattern)+ 模板方法模式(Template Method Pattern)的組合使用

using Microsoft.Extensions.DependencyInjection;namespace ConsoleApp9 {internal class Program{static async Task Main(string[] args){Console.WriteLine("Hello, World!");// 創建并配置依賴注入容器var _serviceProvider new ServiceCollection().AddScoped…

es0102---語法格式、數據類型、整合springboot、創建庫、創建映射、新增數據、自定義查詢

ES 一、創建映射字段的語法格式 需要先構建索引庫&#xff0c;在構建索引庫中的映射關系 PUT /索引庫名/_mapping {"properties": {"字段名": {"type": "類型","index": true&#xff0c;"store": false&#…

spring boot h2數據庫無法鏈接問題

spring boot h2數據庫無法鏈接問題datasource:# 數據庫連接地址&#xff1a;H2在2.x后&#xff0c;不再支持創建數據庫&#xff0c;需要手工創建&#xff0c;如&#xff1a;touch test.mv.db&#xff0c;# 否則會報“Database file not found”錯誤url: jdbc:h2:file:~/testdri…

pycharm配conda環境

最近在做表情包&#xff0c;畫出來的表情包大小不一&#xff0c;但是vx表情包平臺要求統一都是240*240的&#xff0c;所以用Pillow統一處理的一下。 如果你本地裝的python并且添加到path了&#xff0c;pycharm可以自動獲取到&#xff0c;但是我裝得miniconda&#xff0c;pychar…

【Elasticsearch】Elasticsearch 跨機房部署

《Elasticsearch 集群》系列&#xff0c;共包含以下文章&#xff1a; 1?? 冷熱集群架構2?? 合適的鍋炒合適的菜&#xff1a;性能與成本平衡原理公式解析3?? ILM&#xff08;Index Lifecycle Management&#xff09;策略詳解4?? Elasticsearch 跨機房部署5?? 快照與恢…

立式數控深孔鉆的工藝及光學檢測方法 —— 激光頻率梳 3D 輪廓檢測

引言立式數控深孔鉆作為深孔加工的關鍵設備&#xff0c;其工藝水平直接影響零件加工質量。深孔加工面臨排屑、散熱等挑戰&#xff0c;而光學檢測技術的發展為深孔加工精度控制提供了新途徑。激光頻率梳 3D 輪廓檢測技術與立式數控深孔鉆工藝的結合&#xff0c;實現了深孔加工與…

【YOLO系列】YOLOv4詳解:模型結構、損失函數、訓練方法及代碼實現

YOLOv4詳解&#xff1a;模型結構、損失函數、訓練方法及代碼實現 motivation YOLO系列作者Joseph Redmon與Alexey Bochkovskiy致力于解決目標檢測領域的核心矛盾&#xff1a;精度與速度的平衡。YOLOv4的誕生源于兩大需求&#xff1a; 工業落地&#xff1a;在移動端/邊緣設備…

chromedriver下載與安裝方法

chromedriver下載地址&#xff1a; 版本在&#xff1a;http://chromedriver.storage.googleapis.com/index.html 這是下載后&#xff1a; 把exe文件復制到瀏覽器的安裝目錄下 把exe文件復制到python的安裝目錄下 配置環境變量:此電腦→右擊屬性→高級系統設置→環境變量→用戶…

基于QT(C++)實現(圖形界面)選課管理系統

選課管理系統1 概述1.1 課程設計目的和意義根據課程大綱設定&#xff0c;面向對象課程設計的目的是&#xff1a;&#xff08;1&#xff09;理解面向對象的基本思想和三大機制&#xff0c;掌握基于 C 語法的面向對象的基 本概念和開發模式&#xff0c;熟練運用面向對象思維模式…

【阿里云-ACP-1】疑難題解析

1.彈性伸縮 AS 在企業中有廣泛的應用場景,不僅適合業務量不斷波動的應用程序,同時也適合業務量穩定的應用程序。以下關于彈性伸縮的使用說法正確的是( ) 選項內容 A 彈性伸縮可以用于云數據庫 RDS 的自動擴容 B 彈性伸縮支持自動將 ECS 實例或 ECI 實例添加到 Memcache 實…

NLP:seqtoseq英譯法案例

本文目錄&#xff1a;一、案例概述二、數據集三、案例步驟&#xff08;一&#xff09;導入工具包和工具函數&#xff08;二&#xff09;數據預處理&#xff08;三&#xff09;構建數據源對象&#xff08;四&#xff09;構建數據迭代器&#xff08;五&#xff09;構建基于GRU的編…

docker的準備與部署

docker的重復使用bilibli 黑馬視頻 方便查看docker容器。設置格式通過官網dock查看格式命令 命令別名&#xff0c;簡化輸入

Java 大視界 -- Java 大數據在智能教育自適應學習路徑規劃與學習效果強化中的應用(362)

Java 大視界 -- Java 大數據在智能教育自適應學習路徑規劃與學習效果強化中的應用(362) 引言: 正文: 一、Java 構建的智能教育數據架構 1.1 多維度學習數據實時采集 1.2 知識圖譜構建與知識點關聯 二、Java 驅動的自適應學習路徑規劃 2.1 多模型融合的路徑生成 2.2 學習效果…

2.1 為什么定義tensor數據結構?

PyTorch選擇定義Tensors而非直接使用NumPy進行運算和數據處理&#xff0c;主要是因為Tensors在功能、性能和場景適配性上更貼合深度學習的需求。以下是關鍵原因分析&#xff1a; 1. 自動求導與計算圖支持 核心差異&#xff1a;PyTorch的Tensors在運算時會自動構建計算圖&#x…

Qt Quick 3D渲染

Qt Quick 3D是Qt框架中用于創建3D圖形界面的強大模塊&#xff0c;它提供了聲明式的QML API&#xff0c;使得開發者無需深入底層圖形API就能構建復雜的3D場景。本文將全面介紹Qt Quick 3D的核心概念和技術細節&#xff0c;包括3D場景坐標系統、場景環境設置、光照與材質系統、相…

筆試——Day17

文章目錄第一題題目思路代碼第二題題目&#xff1a;思路代碼第三題題目&#xff1a;思路代碼第一題 題目 小樂樂改數字 思路 模擬 當前位置為偶數時&#xff0c;改為0&#xff1b;否則改為1記得取出前導0&#xff1b;stoi()函數可以直接自動去除前導0 代碼 第二題 題目&a…

【c#】完美解決部署IIS 報錯 0x8007000d

1、錯誤頁面&#xff1a;2、解決思路&#xff1a; 1、點擊IIS站點&#xff0c;右鍵點擊瀏覽到文件夾下&#xff0c;路徑打開cmd&#xff0c;找到對應的站點的dll&#xff0c;運行失敗會提示錯誤原因。需要安裝某些dll2、選中站點&#xff0c;點擊模塊&#xff0c;檢查模塊AspNe…

Visual Studio 2010-.Net Framework 4.0項目-NPOI安裝

在管理Nuget程序包中搜索NPOI&#xff0c;下載最新版會報錯&#xff1a;使用程序包控制臺輸入&#xff1a;Install-Package NPOI -Version 2.5.1

Redis原理之分布式鎖

上篇文章&#xff1a; Redis原理之緩存https://blog.csdn.net/sniper_fandc/article/details/149141968?fromshareblogdetail&sharetypeblogdetail&sharerId149141968&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link??????? 目錄 1 …

網絡基礎19:OSPF單區域原理實驗

一、實驗拓撲二、設備配置AR1 配置<AR1> system-view [AR1] interface GigabitEthernet0/0/0 [AR1-GigabitEthernet0/0/0] ip address 192.168.1.1 24 [AR1-GigabitEthernet0/0/0] quit[AR1] ospf 1 router-id 0.0.0.1 [AR1-ospf-1] area 0 [AR1-ospf-1-area-0.0.0.0] ne…