Python及C++中的排序

一、Python中的排序

(一)內置排序函數sorted()

  1. 基本用法
    • sorted()函數可以對所有可迭代對象進行排序操作,返回一個新的列表,原列表不會被修改。
    • 例如,對于一個簡單的數字列表nums = [3, 1, 4, 1, 5, 9, 2, 6],使用sorted(nums)后會得到[1, 1, 2, 3, 4, 5, 6, 9]
    • 對于字符串列表,如words = ["apple", "banana", "cherry", "date"]sorted(words)會按照字母順序排序,得到['apple', 'banana', 'cherry', 'date']
  2. 關鍵字參數
    • key參數
      • 可以通過key參數指定一個函數,該函數會在排序時被調用,用于提取比較的鍵。
      • 比如,如果有一個包含數字和字母的列表mixed_list = ['a', 'c', 'b', 1, 3, 2],我們想要按照字符的ASCII值進行排序,可以使用sorted(mixed_list, key=str)。因為str函數會將數字轉換為字符串,然后按照字符串的ASCII值排序,結果是[1, 2, 3, 'a', 'b', 'c']
      • 對于更復雜的數據結構,如一個包含學生信息的列表students = [{'name': 'Alice', 'age': 23}, {'name': 'Bob', 'age': 20}, {'name': 'Charlie', 'age': 22}],如果按照年齡排序,可以使用sorted(students, key=lambda x: x['age']),得到[{'name': 'Bob', 'age': 20}, {'name': 'Charlie', 'age': 22}, {'name': 'Alice', 'age': 23}]
    • reverse參數
      • 用于指定排序順序,默認為False,表示升序排序。如果設置為True,則為降序排序。
      • 例如,sorted(nums, reverse=True)會將數字列表nums降序排序為[9, 6, 5, 4, 3, 2, 1, 1]

(二)列表的sort()方法

  1. 基本用法
    • sort()方法是列表對象的一個方法,它會直接對原列表進行排序,不返回新的列表。
    • 對于列表nums = [3, 1, 4, 1, 5, 9, 2, 6],調用nums.sort()后,nums就變成了[1, 1, 2, 3, 4, 5, 6, 9]
  2. 關鍵字參數
    • 它也支持keyreverse參數,用法和sorted()函數類似。例如,nums.sort(key=lambda x: -x)會按照數字的相反數進行排序,即降序排序。

二、C++中的排序

(一)標準庫函數sort()

  1. 頭文件
    • 在C++中,要使用sort()函數,需要包含頭文件<algorithm>
  2. 基本用法
    • sort()函數的原型是void sort(RandomAccessIterator first, RandomAccessIterator last),其中firstlast分別是迭代器,表示要排序的范圍。
    • 例如,對于一個數組int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};,可以使用sort(arr, arr + 8);來對整個數組進行升序排序。
    • 對于std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};,可以使用sort(vec.begin(), vec.end());來對vector容器中的元素進行排序。
  3. 自定義比較函數
    • 可以通過提供第三個參數來自定義排序規則。這個參數是一個比較函數,它接收兩個參數,返回一個布爾值。
    • 比如,要對一個結構體數組按照某個成員進行排序,假設有一個結構體struct Person { std::string name; int age; };和一個數組Person people[] = {{"Alice", 23}, {"Bob", 20}, {"Charlie", 22}};,如果按照年齡升序排序,可以這樣寫:
      bool compareAge(const Person &a, const Person &b) {return a.age < b.age;
      }
      sort(people, people + 3, compareAge);
      
    • 也可以使用C++11的lambda表達式來簡化比較函數的定義,例如sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });可以對vector中的整數進行降序排序。

(二)stable_sort()

  1. 穩定性
    • stable_sort()sort()類似,但它是一個穩定排序算法。穩定排序算法是指當兩個元素相等時,它們在排序后的序列中的相對位置保持不變。
    • 例如,對于一個包含重復元素的數組int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};,使用sort(arr, arr + 8);stable_sort(arr, arr + 8);都會得到[1, 1, 2, 3, 4, 5, 6, 9]。但如果數組中有對象,且對象的比較鍵相同,但其他屬性不同,stable_sort()會保持這些對象的原始相對順序。
  2. 用法
    • 它的用法和sort()類似,也可以接受自定義比較函數。例如,對于一個std::vector<Person>,如果按照名字的字典序進行穩定排序,可以這樣寫:
      stable_sort(vec.begin(), vec.end(), [](const Person &a, const Person &b) {return a.name < b.name;
      });
      

三、Python和C++排序的性能比較

  1. Python排序
    • Python的sorted()sort()方法底層實現是Timsort算法,它是一種混合排序算法,結合了歸并排序和插入排序的優點。對于大多數情況,其時間復雜度為O(nlogn),在實際應用中表現很高效。
  2. C++排序
    • C++的sort()函數通常實現為快速排序、歸并排序或堆排序的混合體,具體實現可能因標準庫的實現而異。它的平均時間復雜度也是O(nlogn),但在最壞情況下(如快速排序的輸入為已經有序的數組),可能會退化到O(n^2)。不過,現代C++標準庫通常會優化這種情況。
    • stable_sort()通常基于歸并排序,保證了穩定性,時間復雜度為O(nlogn)。

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

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

相關文章

詳解springcloud nacos使用

1.nacos server安裝 下載 Nacos Server 2.5.1 https://nacos.io/download/nacos-server/?spm5238cd80.2ef5001f.0.0.3f613b7clM2t6D 部署文檔&#xff1a;https://nacos.io/docs/latest/manual/admin/deployment/deployment-standalone/?spm5238cd80.6a33be36.0.0.25b41e5d…

第三篇:Python數據結構深度解析與工程實踐

第一章:列表與字典 1.1 列表的工程級應用 1.1.1 動態數組實現機制 Python列表底層采用動態數組結構,初始分配8個元素空間,當空間不足時按0,4,8,16,25,35...的公式擴容,每次擴容增加約12.5%的容量 通過sys模塊可驗證擴容過程: import sys lst = [] prev_size = 0 for …

NOIP2015提高組.運輸計劃

目錄 題目算法標簽: 樹上倍增, l c a lca lca, 前綴和, 樹上差分, 二分思路代碼* v e c t o r vector vector存鄰接表會超時 題目 521. 運輸計劃 算法標簽: 樹上倍增, l c a lca lca, 前綴和, 樹上差分, 二分 思路 注意到答案是具有二分性質的, 對于某個時間 m i d mid …

MySQL數據過濾、轉換與標準化

數據處理是數據庫操作的重要組成部分&#xff0c;尤其是在大量數據中查找、轉換和規范化目標信息的過程中。為了確保數據的有效性與一致性&#xff0c;MySQL提供了一系列數據過濾、轉換與標準化的功能。 本教程將深入探討數據過濾和轉換的基本方法及應用&#xff0c;內容涵蓋數…

英語學習4.11

gear 【名詞 / 動詞】 &#x1f449; 關鍵詞&#xff1a;齒輪、裝備、調節、使適應 名詞釋義&#xff1a; 齒輪&#xff1a; 一種機械裝置&#xff0c;用于傳遞動力或調節運動。 裝備、工具&#xff1a; 指用于某種活動的設備或工具。 汽車檔位&#xff1a; 汽車中用于改變…

SDC命令詳解:使用相對路徑訪問設計對象(current_instance命令)

相關閱讀 SDC命令詳解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 在使用get_cells等命令訪問設計對象時&#xff0c;需要指定設計對象的名字&#xff0c;這個名字是一個相對路徑&#xff0c;本文就將對此進行討論。 相對路徑 使…

【問題記錄】記錄2個安裝Centos/Anolis系統卡死在安裝包階段的問題?(硬盤分區?換設備)

背景 問題就不詳細記錄了&#xff0c;本文記錄的是Centos/Anolis安裝中卡主的問題。這個問題遇到過幾十次了&#xff0c;嘗試過各種方法。最近一個偶然因素找到了原因。然后翻看歷史上出現這個問題的照片居然是相同的地方卡死。。。 有點意思。特此記錄&#xff0c;希望未來遇…

微信小程序中的openid的作用

微信小程序中的openid的作用 引言 在當今數字化時代&#xff0c;用戶體驗成為了產品成功與否的關鍵因素之一。微信小程序作為連接用戶與服務的重要橋梁&#xff0c;在提升用戶體驗方面發揮著重要作用。其中&#xff0c; openid&#xff08;開放身份標識符&#xff09;是微信小…

《Python星球日記》第25天:Pandas 數據分析

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 訂閱專欄&#xff1a;《Python星球日記》 目錄 一、引言二、數據分組與聚合1. 分組操…

分布式系統-腦裂,redis的解決方案

感謝你的反饋&#xff01;很高興能幫到你。關于你提到的“腦裂”&#xff08;split-brain&#xff09;&#xff0c;這是一個分布式系統中的常見術語&#xff0c;尤其在像 Redis Cluster 這樣的高可用集群中會涉及。既然你問到了&#xff0c;我會從頭解釋“腦裂”的含義、Redis …

重構藝術 | 如何優雅地“提煉函數“

在工作中總數遇到非常多的長代碼&#xff0c;俗稱“屎山”&#xff0c;這類代碼讀起來特別費勁。自己想重構一遍&#xff0c;但是總感覺缺乏經驗指導&#xff0c;因此&#xff0c;多讀書&#xff0c;讀好書可能是最優解之一。讀《重構改善即有代碼的設計》有感&#xff0c;便寫…

每天學一個 Linux 命令(13):touch

Linux 文件管理命令:touch touch 是 Linux 中一個簡單但高頻使用的命令,主要用于創建空文件或修改文件的時間戳(訪問時間、修改時間)。它是文件管理和腳本操作的實用工具。 1. 命令作用 創建空文件:快速生成一個或多個空白文件。更新時間戳:修改文件的訪問時間(Access …

STM32HAL庫學習筆記

目錄 定時器 一些小細節 輸入捕獲計算信號頻率 輸入捕獲計算占空比與頻率 使用定時器不改變占空比的同時改變頻率的方法 串口 重定向原理 重定向代碼 怎么從串口接收到的字符串數據中解析出float型的數據 strchr sscanf memset 第一種實現方法 RTC實時時鐘 LCD顯…

Docker 鏡像、容器與數據卷的高效管理:最佳實踐與自動化腳本20250411

Docker 鏡像、容器與數據卷的高效管理&#xff1a;最佳實踐與自動化腳本 引言 在現代軟件開發中&#xff0c;容器化技術正變得越來越重要。Docker 作為容器化的代表工具&#xff0c;在各大企業中得到了廣泛的應用。然而&#xff0c;隨著容器化應用的增多&#xff0c;如何高效…

Selenium之Actions事件

鼠標、鍵盤組合鍵 在使用selenium的時候&#xff0c;有的時候我們需要鼠標單擊、雙擊、拖動&#xff1b;或者是按下鍵盤的某個鍵&#xff0c;松開某個按鍵&#xff0c;以及組合鍵的使用&#xff1b;今天我們就來看一看&#xff0c;怎么樣實現上面的操作 先把準備工作做好&…

如何在 CentOS 7 系統上以容器方式部署 GitLab,使用 ZeroNews 通過互聯網訪問 GitLab 私有倉庫,進行代碼版本發布與更新

第 1 步&#xff1a; 部署 GitLab 容器? 在開始部署 GitLab 容器之前&#xff0c;您需要創建本地目錄來存儲 GitLab 數據、配置和日志&#xff1a; #創建本地目錄 mkdir -p /opt/docker/gitlab/data mkdir -p /opt/docker/gitlab/config mkdir -p /opt/docker/gitlab/log#gi…

.py文件和.ipynb文件的區別:完整教程

一、概述 Python開發者常用的兩種文件格式.py和.ipynb各有特點&#xff0c;本教程將通過對比分析、代碼示例和場景說明&#xff0c;幫助開發者全面理解二者的區別與聯系。 二、核心區別對比 1. 文件格式本質 特性.ipynb文件.py文件文件類型JSON結構化文檔純文本文件存儲內容…

Go 字符串四種拼接方式的性能對比

簡介 使用完整的基準測試代碼文件&#xff0c;可以直接運行來比較四種字符串拼接方法的性能。 for 索引 的方式 for range 的方式 strings.Join 的方式 strings.Builder 的方式 寫一個基準測試文件 echo_bench_test.go package mainimport ("os""stri…

從代碼學習深度學習 - Bahdanau注意力 PyTorch版

文章目錄 1. 前言為什么選擇Bahdanau注意力本文目標與預備知識2. Bahdanau注意力機制概述注意力機制簡述加性注意力與乘性注意力對比Bahdanau注意力的數學原理與流程圖數學原理流程圖可視化與直觀理解3. 數據準備與預處理數據集簡介數據加載與預處理1. 讀取數據集2. 預處理文本…

19【動手學深度學習】卷積層

1. 從全連接到卷積 2. 圖像卷積 3. 圖形卷積代碼 互相關操作 import torch from torch import nn from d2l import torch as d2ldef corr2d(X, K):"""計算2維互相關運算"""h, w K.shapeY torch.zeros((X.shape[0]-h1, X.shape[1]-w 1))for …