排序算法:【選擇排序]

一、選擇排序——時間復雜度O(n^{2})

定義:第一趟排序,從整個序列中找到最小的數,把它放到序列的第一個位置上,第二趟排序,再從無序區找到最小的數,把它放到序列的第二個位置上,以此類推。

????????也就是說,首先從序列中找到最小的元素,放到有序區的第一個位置上,然后再從剩下的無序區中,繼續找最小的元素,放到有序區的末尾。

1、容易想到的方法——不推薦

????????新建一個空列表,然后每遍歷一次老列表時候,就把一個最小值,放到新列表里,同時再把這個值從老列表里刪除掉。

但這種方法有兩個缺點:

(1)額外占內存。因為新建了一個空列表 l1,所以就會多占用一個內存空間。

(2)時間復雜度高,排序效率慢。

????????列表的增加和刪除方法,時間復雜度都是O(n)。

????????原因:把最小值加到新列表里,首先要先找到最小值,而找最小值的過程,其實就是把所有值都遍歷一遍,所以,增加的操作,時間復雜度式O(n)。

????????同理,對于刪除操作也一樣,你要刪掉最小值,首先得找到,而找最小值的過程就是要把列表全部遍歷一遍,時間復雜度也是O(n)。

????????所以,法1中,增加和刪除操作,它倆時間復雜度其實也就是O(n)+O(n),因為他倆是并行運行的,不是嵌套運行,所以結果還是O(n)。外面還有一個for循環,所以法1代碼,復雜度就是O(n^{2})

# 法1
def select_sort_simple(li):  l1 = []for i in range(len(li)):  # 時間復雜度o(n)l1.append(min(li))   li.remove(min(li)) return l1result = select_sort_simple([5, 3, 7, 2, 4])
print(result)# 結果:
[2, 3, 4, 5, 7]

????????或許你會說,把最小值,賦值給一個變量,比如,a=min(li),然后每次增加刪除這個值,結果還一樣嗎?答案是肯定一樣的,因為,你即使把它賦值給一個變量,但前提,你也得先找到這個最小值,而找最小值的過程就是把列表所有值都遍歷一遍,此時它的復雜度就已經是O(n)了,再加上外面的for循環,代碼整體復雜度還是O(n^{2})

# 法2 最小值,賦值給一個變量
def select_sort_simple(li):  l1 = []for i in range(len(li)):  # 時間復雜度 O(n)a=min(li)   # 時間復雜度 O(n)l1.append(a)   li.remove(a)  return l1result = select_sort_simple([5, 3, 7, 2, 4])
print(result)
# 結果同上

2、使用切片的方式控制無序區——推薦

????????使用切片的方式控制無序區,每一趟排序后,都將無序區中的最小值,放到無序區的第一個位置,也就是說,把無序區的最小值跟無序區的第一個元素進行交換,此時,這個最小值也就自然放到了有序區的末尾。

跟上面方法相比,雖然時間復雜度一樣,但是不用新建空列表。

# 推薦!!!
def select_sort(li): for i in range(len(li) - 1):  # 總共要排n-1趟min_val = min(li[i:])  # !!! 每遍歷一次,無序區就會少一個數a = li.index(min_val)  # 找到最小值的下標li[i], li[a] = li[a], li[i]  # 每趟遍歷,就把最小值與這趟對應位置上的數進行交換# 或者說,就是把無序區的最小值與無序區第一個數進行交換return liresult = select_sort([5, 1, 2, 4])
print(result)
# 結果:
[1, 2, 4, 5]

效果圖:?

當然也可以輸出每趟排序的結果,結果跟上圖也是一樣的:

def select_sort(li):for i in range(len(li) - 1):  # 總共要排n-1趟min_val = min(li[i:])  a = li.index(min_val)  # 找到最小值的下標li[i], li[a] = li[a], li[i] print(li)  # !!每趟排序后的結果return liresult = select_sort([5, 1, 2, 4])
print("最終排序結果", result)# 結果:
[1, 5, 2, 4]
[1, 2, 5, 4]
[1, 2, 4, 5]
最終排序結果 [1, 2, 4, 5]

面方法中,使用的是切片來控制無序區的大小,(或者叫范圍),然后再從這個范圍里找最小值,這里呢,我們也可以使用?for 循環的形式來控制無序區的范圍。代碼如下:

這個跟上面方法類似,但利用切片方式控制無序區范圍,相比for循環會更加簡潔明了,所以推薦切片的方法。

def select_sort(li):for i in range(len(li) - 1):  # 總共要排n-1趟min_loc = i  # 假設無序區的第一個數是最小數for j in range(i+1, len(li)):  # 遍歷無序區if li[j] < li[min_loc]:  # 如果無序區中,有個數比無序區第一個數小min_loc = j  # 改變最小值的下標li[i], li[min_loc] = li[min_loc], li[i]  # 將無序區第一個數與最小數進行交換print(li)  # 每趟排序后的結果return li# result = select_sort([3, 4, 2, 1, 5, 6, 8, 7, 9])
result = select_sort([5, 1, 2, 4])
print("最終排序結果", result)# 結果:
[1, 5, 2, 4]
[1, 2, 5, 4]
[1, 2, 4, 5]
最終排序結果 [1, 2, 4, 5]

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

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

相關文章

軟件項目管理---胡亂復習版

范圍控制的一個重點是避免需求的不合理擴張。(√)一個任務原計劃2個人全職工作2周完成,而實際上只有一個人參與這個任務,到第二周末這個人完成了任務的75%,那么:BCWS = 4人周,ACWP = 2人周,BCWP = 3人周。CV = 1,SV = -1。 【在項目管理中,BCWS、ACWP和BCWP是用來衡量…

微服務測試是什么?

微服務測試是一種特殊的測試類型&#xff0c;因為它涉及到多個獨立的服務。以下是進行微服務測試的一般性步驟&#xff1a; 1. 確定系統架構 了解微服務架構對成功測試至關重要。確定每個微服務的職責、接口、依賴項和通信方式。了解這些信息可以幫助您更好地規劃測試用例和測…

ip ssl證書怎么更換ip地址

ip ssl證書是一種數字證書&#xff0c;為只有公網ip地址的站點建立安全、加密的通信通道。它通常由權威的證書頒發機構&#xff08;CA&#xff09;頒發&#xff0c;并用于驗證網站的身份和安全性。ip ssl證書的主要目的是保護敏感信息&#xff0c;如信用卡號、用戶名和密碼等&a…

IO部分筆記

IO 概述 IO: 存儲和讀取數據的解決方案 作用: 用于讀寫文件中的數據(可以讀寫文件, 或網絡中的數據) IO流的分類 按流的方向: 輸入流, 輸出流 按操作文件類型: 字節流: 可以操作所有類型的文件 字符流: 只能操作純文本文件 純文本文件: windows自帶的記事本打開能讀懂…

react Hooks(useRef、useMemo、useCallback)實現原理

Fiber 上篇文章fiber簡單理解記錄了react fiber架構&#xff0c;Hooks是基于fiber鏈表來實現的。閱讀以下內容時建議先了解react fiber。 jsx -> render function -> vdom -> fiber樹 -> dom vdom 轉 fiber 的過程稱為 recocile。diff算法就是在recocile這個過程…

認識lambda架構(架構師考試復習)

Lambda架構主要分為三層&#xff0c;批處理層、加速層和服務層。 如下圖所示&#xff1a; &#xff08;1&#xff09;批處理層&#xff08;Batch Layer&#xff09;&#xff1a;存儲數據集&#xff0c;在數據集上預先計算查詢函數&#xff0c;并構建查詢對應的view。Batch Lay…

mysql 5.7 Unknown column ‘password‘ in ‘field list‘

問題現象&#xff1a; 執行sql : select user&#xff0c;host,password from user&#xff1b;時提示 ERROR 1054(42S22):Unknown column password in field list 現象如下圖所示&#xff1a; mysql 5.7開始 密碼字段用&#xff1a;authentication_string

Redis哨兵模式:什么是哨兵模式、哨兵模式的優缺點、哨兵模式的主觀下線和客觀下線、投票選舉、Redis 哨兵模式搭建

文章目錄 什么是哨兵模式哨兵模式的優缺點主觀下線和客觀下線投票選舉哨兵模式場景應用Redis version 6.0.5 集群搭建下載文件環境安裝解壓編譯配置文件啟動關閉密碼設置 什么是哨兵模式 哨兵模式是Redis的高可用解決方案之一&#xff0c;它旨在提供自動故障轉移和故障檢測的功…

2023年四川網信人才技能大賽 實操賽Writeup

文章目錄 Crypto比base64少的baseaffine簡單的RSA Misc不要動我的flagSimpleUSB猜猜我是誰不聰明的AI Pwngetitezbbstack Reverse誰的DNA動了Dont Touch Me Weblittle_gamejustppbezbbssmart 題目附件&#xff0c;文章末尾微信公眾號點點關注親&#xff0c;謝謝親~ 題目附件鏈接…

C++ Qt開發:PushButton按鈕組件

Qt 是一個跨平臺C圖形界面開發庫&#xff0c;利用Qt可以快速開發跨平臺窗體應用程序&#xff0c;在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置&#xff0c;實現圖形化開發極大的方便了開發效率&#xff0c;本章將重點介紹QPushButton按鈕組件的常用方法及靈活運用。 …

電子眼+無人機構建平安城市視頻防控監控方案

電子眼&#xff08;也稱為監控攝像機&#xff09;可以通過安裝在城市的不同角落&#xff0c;實時監控城市的各個地方。它們可以用于監測交通違法行為、監控公共場所的安全以及實時監測特定區域的活動情況。通過電子眼的應用&#xff0c;可以幫助警方及時發現并響應各類安全事件…

Ubuntu安裝TensorRT

文章目錄 1. 安裝CUDAa. 下載CUDAb. 安裝CUDAc. 驗證CUDA 2. 安裝CUDNNa. 下載CUDNNb. 安裝CUDNNc. 驗證CUDNN 3. 安裝TensorRTa. 下載TensorRTb. 解壓TensorRTc. 安裝TensorRTd. 安裝uff和graphsurgeone. 驗證是否安裝成功f. 備注 關注公眾號&#xff1a;『AI學習星球』 回復&…

spring boot學習第五篇:spring boot與JPA結合

1、準備表&#xff0c;創建表語句如下 CREATE TABLE girl (id int(11) NOT NULL AUTO_INCREMENT,cup_Size varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4…

C語言-鏈表_基礎

鏈表-基礎 1. 數組 1.1 靜態數組 例子:int nums[5] {0};struct person ps[5]; 缺點:1,無法修改地址2,無法動態定義長度3,占用內存過大或過小4,增刪速度慢 優點數組的內存是連續開辟的,所以讀取速度快1.2 動態數組 例子:int *nums (int *) calloc(5,sizeof(int));struct p…

Vmware突然無法獲取IP(二)

一 測試環境 宿主機&#xff1a; window10Vmware 17 proUbuntu 18.04虛擬機中 二 問題 之前虛擬機可以正常使用。過程中&#xff0c;安裝了docker&#xff08;不確定是否和這個有關系&#xff09;第二天開啟虛擬機時&#xff0c;發現網口為down的狀態。將網口up后&#xff0…

python第三方庫——openpyxl

Bokeh是一個Python庫&#xff0c;用于對Excel 2010 xlsx/xlsm/xltx/xltm文件進行讀寫操作。 官網對該工具的介紹為&#xff1a; openpyxl is a Python library to read/write Excel 2010 xlsx/xlsm/xltx/xltm files.It was born from lack of existing library to read/write…

使用Java實現漢諾塔問題

文章目錄 漢諾塔問題 今天和大家來看看漢諾塔問題&#xff0c;這也是一個經典的算法 漢諾塔問題 分治算法經典問題&#xff1a;漢諾塔問題 漢諾塔的傳說 漢諾塔&#xff1a;漢諾塔&#xff08;又稱河內塔&#xff09;問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的…

Git 克隆子目錄

背景 有時候&#xff0c;一個倉庫太大&#xff08;包含很多個工程&#xff09;&#xff0c;下載費時&#xff0c;又占電腦的空間。 如何只下載其中一個工程&#xff08;子目錄&#xff09;呢&#xff1f; 稀疏檢出&#xff08;Spare Checkout&#xff09; git 的 Spare Chec…

Java項目-瑞吉外賣Day5

視線新增套餐功能&#xff1a; 創建SetmealDish&#xff0c;SetmealDto類&#xff0c;與相關的mapper&#xff0c;service&#xff0c;serviceImpl&#xff0c;controller類。 Setmeal表示套餐&#xff0c;SetmealDish表示套餐對應的菜品。 交互過程&#xff1a; 前端請求&a…

TCP 和 UDP 區別? 2、TCP/IP 協議涉及哪幾層架構? 3、描述下 TCP 連接 4 次揮手的過程?為什么要 4 次揮手?

文章目錄 1、TCP 和 UDP 區別&#xff1f;2、TCP/IP 協議涉及哪幾層架構&#xff1f;3、描述下 TCP 連接 4 次揮手的過程&#xff1f;為什么要 4 次揮手&#xff1f;4、計算機插上電源操作系統做了什么&#xff1f;5、Linux 操作系統設備文件有哪些&#xff1f; 1、TCP 和 UDP …