C++算法·排序

排序的定義

這個不用說吧
就是根據某個條件對一個數列進行有序的操作
例如要求從小到大排序、從大到小排序等等

排序的分類

比較排序(Comparison(Comparison(Comparison Sorts)Sorts)Sorts)

特點:通過元素間的比較決定順序
時間復雜度下限O(nO(nO(n logloglog n)n)n)

排序算法平均時間復雜度空間復雜度穩定性特點
冒泡排序O(n2)O(n2)O(n2)O(1)O(1)O(1)穩定簡單但慢
選擇排序O(n2)O(n2)O(n2)O(1)O(1)O(1)不穩定每次選最小放前面
插入排序O(n2)O(n2)O(n2)O(1)O(1)O(1)穩定對小規模數據高效
快速排序O(nO(nO(n logloglog n)n)n)O(logn)O(log n)O(logn)不穩定分治思想,實際最快
歸并排序O(nO(nO(n logloglog n)n)n)O(n)O(n)O(n)穩定分治+合并,需額外空間
堆排序O(nO(nO(n logloglog n)n)n)O(1)O(1)O(1)不穩定利用堆結構

非比較排序(Non?Comparison(Non-Comparison(Non?Comparison Sorts)Sorts)Sorts)

特點:不直接比較元素,利用數值特性
時間復雜度:可突破O(nO(nO(n logloglog n)n)n)下限

排序算法時間復雜度空間復雜度穩定性適用場景
計數排序O(n+k)O(n+k)O(n+k)O(k)O(k)O(k)穩定整數且范圍小(kkk為范圍)
桶排序O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)O(n+k)穩定數據均勻分布
基數排序O(d(n+k))O(d(n+k))O(d(n+k))O(n+k)O(n+k)O(n+k)穩定整數按位排序(ddd為位數)

建議

  • 通用快速排序(STL 的 sort
  • 穩定歸并排序(STL 的 stable_sort
  • 小范圍整數計數排序
  • 數據大堆排序(避免快排遞歸棧溢出)

:實際代碼實現需根據數據特點選擇

模板代碼示例

這里給出常用的冒泡排序、選擇排序、快速排序等
內容解釋在代碼注釋里,全是干貨可以直接食用

冒泡排序

#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];//核心代碼for(int i=1;i<=n-1;i++){//n-1輪排序bool swapped=false;//優化:記錄是否發生交換for(int j=1;j<=n-i;j++){//每輪比較前n-i個元素if(a[j]>a[j+1]){//相鄰元素比較swap(a[j],a[j+1]);//交換swapped=true;}}if(!swapped)break;//本輪無交換說明已有序}for(int i=1;i<=n;i++)cout<<a[i]<<" ";//排序后結果return 0;
}

選擇排序

#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];//核心代碼for(int i=1;i<=n-1;i++){//n-1輪選擇int minn=i;//記錄最小值位置for(int j=i+1;j<=n;j++){//在未排序部分找最小值if(a[j]<a[minn])minn=j;}swap(a[i],a[minn]);//把最小值放到已排序末尾}for(int i=1;i<=n;i++)cout<<a[i]<<" ";//排序后結果return 0;
}

快速排序

可以用自己寫函數更改排序條件
一般配合結構體使用,下篇文章有講到

#include<iostream>
#include<algorithm>
//sort函數必要頭文件,如果不想加可以自己寫sort
using namespace std;
int a[5000001];//待排序數組
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);//直接調用sort函數排序[1,n]區間for(int i=1;i<=n;i++)cout<<a[i]<<" ";//排序后結果,快排是最簡單的排序~return 0;
}

插入排序

#include<iostream>
using namespace std;
int a[5000001];//待排序數組
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=2;i<=n;i++){//從第二個元素開始!!int key=a[i];//當前要插入的元素int j=i-1;while(j>=1&&a[j]>key){//向前找插入位置a[j+1]=a[j];//元素后移j--;}a[j+1]=key;//插入元素}for(int i=1;i<=n;i++)cout<<a[i]<<" ";//排序后結果return 0;
}

計數排序

#include<iostream>
using namespace std;
const int N=5000001;
const int K=100000;//數據范圍自行調整
int a[N],cnt[K],b[N];
void csort(int n){for(int i=1;i<=n;i++)cnt[a[i]]++;for(int i=1;i<K;i++)cnt[i]+=cnt[i-1];for(int i=n;i>=1;i--)b[cnt[a[i]]--]=a[i];for(int i=1;i<=n;i++)a[i]=b[i];
}
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];csort(n);for(int i=1;i<=n;i++)cout<<a[i]<<" ";return 0;
}

這個注釋不好寫,講一下

變量定義說明:

  • a[]:待排序數組
  • cnt[]:計數數組
  • b[]:臨時存儲排序結果
  • K:數據最大值范圍

流程:

  • 統計每個元素出現次數(cnt[a[i]]++
  • 計算前綴和確定元素位置(cnt[i]+=cnt[i-1]
  • 反向填充保證穩定性(b[cnt[a[i]]--]=a[i]
  • 回寫到原數組(a[i]=b[i]

注意事項:

  • 僅適用于非負整數排序
  • 數據范圍K需要提前確定
  • 時間復雜度:O(n+K)(線性時間)

例題實戰

【題目傳送門】【題目傳送門】【題目傳送門】

P1177 【模板】排序

題目描述

將讀入的 NNN 個數從小到大排序后輸出。

輸入格式

第一行為一個正整數 NNN

第二行包含 NNN 個空格隔開的正整數 aia_iai?,為你需要進行排序的數。

輸出格式

將給定的 NNN 個數從小到大輸出,數之間空格隔開,行末換行且無空格。

輸入輸出樣例 #1

輸入 #1

5
4 2 4 5 1

輸出 #1

1 2 4 4 5

說明/提示

對于 20%20\%20% 的數據,有 1≤N≤1031 \leq N \leq 10^31N103

對于 100%100\%100% 的數據,有 1≤N≤1051 \leq N \leq 10^51N1051≤ai≤1091 \le a_i \le 10^91ai?109

分析

簡單的排序模板題,范圍不大
可以直接用最簡單的sortsortsort秒過
沒看懂的可以看上方代碼↑有注釋解釋
直接上代碼↓

例題代碼

#include <iostream>
#include <algorithm>
using namespace std;
int n,a[1000005];//數組范圍10^5
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+1+n);//快排for(int i=1;i<=n;i++)cout<<a[i]<<" ";return 0;
}

題單推薦

排序?題單排序·題單排序?題單
例題和題單來自洛谷洛谷洛谷

~ 完結撒花完結撒花完結撒花 ~

附:這篇比較簡單,之前忘記講了
之前漏了很多,把基礎補回來之后再講后面的例題
下一篇預告:遞推遞歸或者結構體

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

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

相關文章

微服務項目中的注冊中心——Nacos配置

從零開始&#xff1a;Nacos服務注冊與配置中心實戰教程 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴開源的服務發現、配置管理工具&#xff0c;集注冊中心與配置中心于一體&#xff0c;廣泛應用于微服務架構。本文將從環境搭建到實戰配…

日期格式化成英文月,必須指定語言環境

如果不指定Locale.ENGLISH 在有些JDK下 輸出6月 INV USD 314,791.77,DUE 25-07 [PAID USD 503,389.56 ON 2025-07-16]Mar INV USD 52,042.00,DUE 25-07 [PAID USD 52,042.00 ON 2025-08-11]所以必…

【6】Transformers快速入門:Transformer 的注意力層 是啥?

一句話看懂注意力層作用&#xff1a;讓 AI 像人一樣 “抓重點” &#xff08;比如讀“貓追老鼠”&#xff0c;自動聚焦 “追” 這個動作&#xff0c;忽略無關詞&#xff09;1. 為什么需要注意力&#xff1f; 問題場景&#xff08;翻譯例子&#xff09;&#xff1a; 英文&#x…

集合,完整擴展

目錄 前言&#xff1a; 一、List接口 1.1 ArrayList 1.2 LinkedList 1.3 Vector 二、Set接口 2.1 HashSet 2.2 TreeSet 2.3 LinkedHashSet 三、應用選擇 前言&#xff1a; 本篇文章重點梳理 List 接口和 Set 接口的核心內容&#xff0c;結合代碼案例幫大家吃透它們的…

【doris基礎與進階】3-Doris安裝與部署

安裝前的準備 在windows系統上通過vmwareubuntu 22.04的方式進行安裝&#xff0c;由于資源有限&#xff0c;在同1臺機器上同時安裝fe和be&#xff08;broker本次不安裝&#xff0c;極簡化安裝&#xff09;&#xff0c;安裝版本為2.1.10&#xff0c;2.x版本架構不會有大的變化&a…

關于數據結構6-哈希表和5種排序算法

哈希表1哈希算法將數據通過哈希算法映射成一個鍵值&#xff0c;存取都在同一個位置實現數據的高效存儲和查找&#xff0c;將時間復雜度盡可能降低至O(1)2哈希碰撞多個數據通過哈希算法得到的鍵值相同&#xff0c;成為產生哈希碰撞3哈希表&#xff1a;構建哈希表存放0-100之間的…

AWT與Swing深度對比:架構差異、遷移實戰與性能優化

全面對比分析Java AWT與Swing GUI框架的架構差異、性能表現和適用場景&#xff0c;提供完整的AWT到Swing遷移實戰指南&#xff0c;包含15代碼示例、性能測試數據、最佳實踐建議&#xff0c;助你做出明智的技術選型和實現平滑遷移。 Java AWT, Swing, GUI框架對比, 代碼遷移, 性…

git倉庫檢測工具

介紹 Gitleaks 是一款用于檢測git 倉庫、文件以及任何你想通過 git 傳遞的信息(例如密碼、API 密鑰和令牌)的工具stdin。如果你想了解更多關于檢測引擎工作原理的信息,請查看這篇博客:正則表達式(幾乎)就是你所需要的一切。 ? ~/code(master) gitleaks git -v○│╲│…

【4】Transformers快速入門:自然語言模型 vs 統計語言模型

一句話關系總結 統計語言模型 自然語言模型的“數學基礎” &#xff08;就像加減乘除是數學的基礎&#xff0c;統計模型是AI學說話的基礎工具&#xff09;區別對比表&#xff08;小白版&#xff09;維度統計語言模型自然語言模型本質用數學公式算句子概率用神經網絡模仿人腦理…

[激光原理與應用-252]:理論 - 幾何光學 - 傳統透鏡焦距固定,但近年出現的可變形透鏡(如液態透鏡、彈性膜透鏡)可通過改變自身形狀動態調整焦距。

一、液態透鏡&#xff1a;電潤濕效應驅動曲率變化基本結構液態透鏡由兩種互不相溶的液體&#xff08;如導電水溶液與絕緣硅油&#xff09;封裝在透明圓筒形容器中構成。容器壁經疏水處理&#xff0c;使水溶液呈圓頂型聚集在中心&#xff0c;與硅油形成凸狀曲面。工作原理電潤濕…

wordpress數據庫導入時的#1044錯誤

在wordpress網站數據庫文件.sql導入到數據庫時&#xff0c;發生錯誤&#xff0c;錯誤提示如下&#xff1a;#1044 – Access denied for user ‘wodepress_com’’localhost’ to database ‘wodepress’。 這個錯誤表明用戶wodepress_com沒有權限訪問數據庫wodepress。以下是解…

微服務ETCD服務注冊和發現

1.什么是注冊中心 注冊中心主要有三種角色&#xff1a; 服務提供者&#xff08;RPC Server&#xff09;&#xff1a;在啟動時&#xff0c;向 Registry 注冊自身服務&#xff0c;并向 Registry 定期發送心跳匯報存活狀態。 服務消費者&#xff08;RPC Client&#xff09;&…

計算機網絡---默認網關(Default Gateway)

一、默認網關的定義 默認網關&#xff08;Default Gateway&#xff09;是一個網絡設備&#xff08;通常是路由器、防火墻或三層交換機&#xff09;的IP地址&#xff0c;它是本地網絡中的設備訪問其他網絡&#xff08;如外網、其他子網&#xff09;時&#xff0c;數據報文的“第…

OpenBMC中libgpio架構與驅動交互全解析:從硬件映射到應用控制

1. libgpio概述與核心定位 libgpio作為OpenBMC中GPIO管理的核心庫&#xff0c;扮演著連接硬件驅動與上層應用的橋梁角色。它通過標準化的接口抽象了不同硬件平臺的GPIO操作細節&#xff0c;使得電源控制、傳感器監控等關鍵功能能夠以統一的方式訪問GPIO資源。 1.1 libgpio在Ope…

開放原子開源生態大會:麒麟信安加入openEuler社區AI聯合工作組,聚焦操作系統開源實踐與行業賦能

7月23日&#xff0c;由開放原子開源基金會主辦的2025開放原子開源生態大會在京開幕&#xff0c;大會以“開源賦能產業&#xff0c;生態共筑未來”為主題。工業和信息化部副部長熊繼軍、北京市人民政府副秘書長許心超出席大會并致辭。作為開放原子開源基金會黃金捐贈人和開源重要…

Lyapunov與SAC算法的數學結構對比:從二次漂移到TD損失

一、李雅普諾夫優化中二次漂移函數的推導 李雅普諾夫優化的核心是通過設計 “李雅普諾夫函數” 和 “漂移項”&#xff0c;保證系統狀態收斂到穩定點。以下以線性時不變系統為例&#xff08;非線性系統推導邏輯類似&#xff0c;僅動力學方程更復雜&#xff09;&#xff0c;推導…

WireShark:非常好用的網絡抓包工具

文章目錄一、寫在前面二、安裝三、使用1、入門使用&#xff08;1&#xff09;打開軟件&#xff08;2&#xff09;右鍵網卡&#xff0c;Start Capture(開始捕獲)2、界面詳細介紹3、過濾器設置一、寫在前面 Wireshark是使用最廣泛的一款「開源抓包軟件」&#xff0c;常用來檢測網…

WEB技術演進史:從C/S到微服務架構

WEB技術 HTTP協議和B/S 結構 操作系統有進程子系統&#xff0c;使用多進程就可以充分利用硬件資源。進程中可以多個線程&#xff0c;每一個線程可以被CPU調度執行&#xff0c;這樣就可以讓程序并行的執行。這樣一臺主機就可以作為一個服務器為多個客戶端提供計算服務。 客戶端…

win11中Qt5.14.0+msvc2019+opencv4.9配置

本文主要研究由msvc編譯的opencv在QT中的配置&#xff0c;opencv可以是官網直接下載的版本&#xff0c;也可以是msvc(例如vs2019)通過cmake編譯 contrib功能的opencv版本&#xff0c;這2種版本對qt版本沒有嚴格要求&#xff0c;但是若在cmake中選擇了with_qt功能&#xff0c;那…

【listlist模擬】

list&list模擬1.list使用2、list模擬附錄1.list使用 list常見接口不做介紹&#xff0c;跟前面vector有相似之處&#xff0c;跟數據結構list基本一樣。 ?因為list使用帶頭的雙向循環鏈表實現的&#xff0c;不能用小標訪問&#xff0c;只能用迭代器或范圍for訪問 list有成…