第十四天- 排序

一、排序的基本概念

排序是計算機科學中一項重要的操作,它將一組數據元素按照特定的順序(如升序或降序)重新排列。排序算法的性能通常通過時間復雜度和空間復雜度來衡量。在 Python 中,有內置的排序函數,同時也可以手動實現各種排序算法。

二、Python 內置排序函數

1.?sorted()?函數

sorted()?函數可以對任何可迭代對象進行排序,并返回一個新的已排序列表,原對象不會被修改。

python

# 對列表進行排序
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = sorted(numbers)
print("使用 sorted() 排序后的列表:", sorted_numbers)# 對字符串進行排序
string = "python"
sorted_string = ''.join(sorted(string))
print("對字符串排序后的結果:", sorted_string)# 對字典按鍵排序
dictionary = {'c': 3, 'a': 1, 'b': 2}
sorted_dict_keys = sorted(dictionary.keys())
print("對字典按鍵排序后的結果:", sorted_dict_keys)

2.?list.sort()?方法

list.sort()?方法是列表對象的一個方法,它會直接對原列表進行排序,不返回新的列表。

python

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
numbers.sort()
print("使用 list.sort() 排序后的列表:", numbers)

3. 自定義排序規則

sorted()?和?list.sort()?都可以接受一個?key?參數,用于指定排序的規則。

python

# 按字符串長度排序
words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=len)
print("按字符串長度排序后的列表:", sorted_words)# 按自定義函數排序
students = [{"name": "Alice", "age": 20},{"name": "Bob", "age": 18},{"name": "Charlie", "age": 22}
]
sorted_students = sorted(students, key=lambda x: x["age"])
print("按年齡排序后的學生列表:", sorted_students)

三、常見排序算法的 Python 實現

1. 冒泡排序(Bubble Sort)

冒泡排序是一種簡單的排序算法,它重復地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。

python

def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n - i - 1):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]return arrnumbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = bubble_sort(numbers)
print("冒泡排序后的列表:", sorted_numbers)

2. 選擇排序(Selection Sort)

選擇排序是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。

python

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 arrnumbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = selection_sort(numbers)
print("選擇排序后的列表:", sorted_numbers)

3. 插入排序(Insertion Sort)

插入排序是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。

python

def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arrnumbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = insertion_sort(numbers)
print("插入排序后的列表:", sorted_numbers)

4. 快速排序(Quick Sort)

快速排序是一種分治的排序算法。它選擇一個基準值,將數組分為兩部分,小于基準值的元素放在左邊,大于基準值的元素放在右邊,然后遞歸地對左右兩部分進行排序。

python

def quick_sort(arr):if len(arr) <= 1:return arrelse:pivot = arr[0]left = [x for x in arr[1:] if x <= pivot]right = [x for x in arr[1:] if x > pivot]return quick_sort(left) + [pivot] + quick_sort(right)numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = quick_sort(numbers)
print("快速排序后的列表:", sorted_numbers)

5. 歸并排序(Merge Sort)

歸并排序是一種分治算法,它將一個數組分成兩個子數組,分別對這兩個子數組進行排序,然后將排好序的子數組合并成一個最終的有序數組。

python

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 resultnumbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = merge_sort(numbers)
print("歸并排序后的列表:", sorted_numbers)

四、排序算法復雜度分析

排序算法平均時間復雜度最壞時間復雜度最好時間復雜度空間復雜度穩定性
冒泡排序\(O(n^2)\)\(O(n^2)\)\(O(n)\)\(O(1)\)穩定
選擇排序\(O(n^2)\)\(O(n^2)\)\(O(n^2)\)\(O(1)\)不穩定
插入排序\(O(n^2)\)\(O(n^2)\)\(O(n)\)\(O(1)\)穩定
快速排序\(O(n log n)\)\(O(n^2)\)\(O(n log n)\)\(O(log n)\)不穩定
歸并排序\(O(n log n)\)\(O(n log n)\)\(O(n log n)\)\(O(n)\)穩定

五、總結

  • Python 內置的?sorted()?函數和?list.sort()?方法使用方便,性能也比較好,在大多數情況下可以直接使用。
  • 不同的排序算法有不同的時間復雜度和空間復雜度,在選擇排序算法時需要根據具體的應用場景進行選擇。例如,當數據量較小時,簡單的排序算法(如冒泡排序、選擇排序、插入排序)可能更合適;當數據量較大時,高效的排序算法(如快速排序、歸并排序)則更有優勢。

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

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

相關文章

移除idea External Liraries 中maven依賴包

問題背景 擴展包里面不停的出現已經在POM文件注釋的包&#xff0c;其實是沒有查詢到根源位置。 在IDEA插件中搜索Maven Helper 點擊pom.xml文件 會出現擴展插件 定位之后在pom中添加exclusions&#xff0c;如下代碼 <dependency><groupId>com.disney.eva.framewo…

AI革命!藍耘攜手海螺AI視頻,打造智能化視頻新紀元

AI革命&#xff01;藍耘攜手海螺AI視頻&#xff0c;打造智能化視頻新紀元 前言 在這個信息爆炸的時代&#xff0c;視頻已經成為我們獲取信息、學習新知識的重要方式。而隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;AI與視頻內容的結合為我們帶來了全新的…

dify1.1.1安裝

1、 按照GitHub上操作 下載源碼&#xff0c;沒有安裝git的&#xff0c;可以下載成zip包&#xff0c; unzip 解壓 git clone https://github.com/langgenius/dify.git cd dify cd docker cp .env.example .env2、啟動前 &#xff0c;先改下 docker-compose.yaml&#xff0c;…

ElasticSearch 可觀測性最佳實踐

ElasticSearch 概述 ElasticSearch 是一個開源的高擴展的分布式全文檢索引擎&#xff0c;它可以近乎實時的存儲、檢索數據&#xff1b;本身擴展性很好&#xff0c;可以擴展到上百臺服務器&#xff0c;處理 PB 級別&#xff08;大數據時代&#xff09;的數據。ES 也使用 Java 開…

Excel處理控件Spire.XLS系列教程:C# 在 Excel 中添加或刪除單元格邊框

單元格邊框是指在單元格或單元格區域周圍添加的線條。它們可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引讀者注意重要的單元格或使工作表看起來更美觀。本文將介紹如何使用 Spire.XLS for .NET 在 C# 中添加或刪除 Excel 單元格邊框。 安裝 Spire.XLS for .NET E-…

前端Wind CSS面試題及參考答案

目錄 標準盒模型與 IE 盒模型的區別是什么?如何通過 box-sizing 屬性切換這兩種盒模型? 如何計算一個元素在標準盒模型下的總寬度(包含 margin、padding、border)? 父元素高度塌陷的原因是什么?請列舉至少 3 種清除浮動的方法。 方法一:使用 clear 屬性 方法二:使用…

基于 ECharts 實現動態圖表渲染支持10萬+數據點實時更新方案

引言 實現支持10萬數據點實時更新的動態圖表渲染確實具有挑戰性&#xff0c;尤其是在性能和用戶體驗方面。以下是一些關鍵點和應用場景&#xff1a; 關鍵挑戰 性能優化&#xff1a; 渲染性能&#xff1a;大量數據點會導致瀏覽器渲染壓力大&#xff0c;可能引發卡頓。數據處理…

裝飾器模式 (Decorator Pattern)

裝飾器模式 (Decorator Pattern) 是一種結構型設計模式,它動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾器模式相比生成子類更為靈活。 一、基礎 1 意圖 動態地給一個對象添加一些額外的職責。 就增加功能來說,裝飾器模式相比生成子類更為靈活。 2 適用場景 當…

【Java】TCP網絡編程:從可靠傳輸到Socket實戰

活動發起人小虛竹 想對你說&#xff1a; 這是一個以寫作博客為目的的創作活動&#xff0c;旨在鼓勵大學生博主們挖掘自己的創作潛能&#xff0c;展現自己的寫作才華。如果你是一位熱愛寫作的、想要展現自己創作才華的小伙伴&#xff0c;那么&#xff0c;快來參加吧&#xff01…

藍橋杯C++基礎算法-0-1背包

這段代碼實現了一個經典的0-1 背包問題的動態規劃解法。0-1 背包問題是指給定一組物品&#xff0c;每個物品有其體積和價值&#xff0c;要求在不超過背包容量的情況下&#xff0c;選擇物品使得總價值最大。以下是代碼的詳細思路解析&#xff1a; 1. 問題背景 給定 n 個物品&am…

html5炫酷的科技感3D文字效果實現詳解

炫酷的科技感3D文字效果實現詳解 這里寫目錄標題 炫酷的科技感3D文字效果實現詳解項目概述核心技術實現1. 3D文字效果2. 故障藝術效果&#xff08;Glitch Effect&#xff09;3. 動態網格背景4. 掃描線效果5. 粒子效果 性能優化考慮技術難點與解決方案項目總結擴展優化方向 項目…

車道保持中車道線識別

需要讓小車保持車道行駛&#xff0c;首先需要進行車道線識別。 也可參看論文&#xff08;上傳到資源里&#xff09;&#xff1a;自動駕駛汽車車道檢測與預測的技術解析-基于圖像處理和Hough變換的方法 1 車道識別流程 想進行車道線識別&#xff0c;并且希望在圖像中選擇一個特…

英偉達有哪些支持AI繪畫的 工程

英偉達在AI繪畫領域布局廣泛&#xff0c;其自研工具與第三方合作項目共同構建了完整的技術生態。以下是其核心支持AI繪畫的工程及合作項目的詳細介紹&#xff1a; 一、英偉達自研AI繪畫工具 1. GauGAN系列 技術特點&#xff1a;基于生成對抗網絡&#xff08;GAN&#xff09;&…

驅動開發的引入

1.引入 Linux內核的整體架構本就非常龐大&#xff0c;其包含的組件也非常多。而我們怎樣把需要的部分都包含在內核中呢? 一種方法是把所有需要的功能都編譯到Linux內核中。這會導致兩個問題&#xff0c;一是生成的內核會很大&#xff0c;二是如果我們要在現有的內核中新增或刪…

AI日報 - 2025年3月24日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | Lyra生物序列建模架構效率驚人 在100生物任務中達最優&#xff0c;推理速度提升高達12萬倍 ▎&#x1f4bc; 商業動向 | OpenAI用戶破4億&#xff0c;Meta與Reliance探討AI合作 生態擴展與全…

VMware上對CentOS7虛擬機進行磁盤擴容、縮容

在VMware 17 Pro上對CentOS 7虛擬機進行磁盤擴容&#xff0c;同時保證原先部署的軟件正常使用&#xff0c;可以按照以下步驟進行操作&#xff1a; 一、擴容 步驟一&#xff1a;關閉虛擬機并在VMware中擴展磁盤容量 關閉虛擬機&#xff1a;在VMware Workstation 17 Pro中&…

.gitignore使用指南

.gitignore使用指南 目錄 什么是.gitignore為什么需要.gitignore如何創建.gitignore文件.gitignore文件的語法規則 忽略單個文件忽略目錄忽略特定類型的文件不忽略特定文件或目錄遞歸匹配 示例.gitignore文件注意事項更多特殊場景匹配規則 忽略多個特定后綴的文件忽略特定目錄…

OpenCV旋轉估計(3)幫助構建一個最大生成樹(Maximum Spanning Tree)函數findMaxSpanningTree()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::findMaxSpanningTree 是 OpenCV 中用于圖像拼接工作流的一個函數&#xff0c;它幫助構建一個最大生成樹&#xff08;Maximum Spanni…

Android在kts中簡單使用AIDL

Android在kts中簡單使用AIDL AIDL相信做Android都有所了解&#xff0c;跨進程通信會經常使用&#xff0c;這里就不展開講解原理跨進程通信的方式了&#xff0c;最近項目換成kts的方式&#xff0c;于是把aidl也換成了統一的方式&#xff0c;其中遇到了很多問題&#xff0c;這里…

論文閱讀:2024-NAACL Semstamp、2024-ACL (Findings) k-SemStamp

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Semstamp: A semantic watermark with paraphrastic robustness for text generation https://aclanthology.org/2024.naacl-long.226/ k-SemStamp: A Clustering-Based Semantic Wate…