八大排序——c++版

本次排序都是按照升序排的

冒泡排序

void bubbleSort(vector<int>& nums)
{int n=nums.size();for(int i=0;i<n-1;i++){bool swapped=false;for(int j=0;j<n-1-i;j++){if(nums[j]>nums[j+1]){swap(nums[j],nums[j+1]);swapped=true;}}if(!swapped)break;}
}
//算法原理: 一共排序n-1次,每一次排序,相鄰元素兩兩比較,一共比較n-1-i次,最后排出一個元素放在數組末尾,n-1次后,排序完成。
//       ? 若還沒有到第n-1次排序,比較元素沒有交換位置,則排序已完成,可提前結束排序。
//時間復雜度: O(N^2)
//空間復雜度: O(1)
//穩定性: 穩定

選擇排序

void SelectSort(vector<int>& nums)
{int n=nums.size();for(int i=0;i<n-1;i++){int minIndex=i;for(int j=i+1;j<n;j++){if(nums[j]<nums[minIndex]){minIndex=j;}}swap(nums[i],nums[minIndex]);}
}
//算法原理: 需要選擇n-1次基準元素,從下標為0開始選取,然后與未排序的元素比較,找到元素最小的下標,交換基準元素和最小元素,一次排序
//       ? 已完成。一共排序n-1次。     ? 
//時間復雜度: O(N^2)
//空間復雜度: O(1)
//穩定性: 不穩定

插入排序

void InsertSort(vector<int>& nums)
{int n=nums.size();for(int i=1;i<n;i++){int key=nums[i],j=i-1;while(j>=0&&nums[j]>key){nums[j+1]=nums[j];j--;}nums[j+1]=key;}
}
//算法原理: 從下標為1開始,令其為key,然后插入到已排序的元素中,找到應該插入的位置。   ? 
//時間復雜度: O(N^2)
//空間復雜度: O(1)
//穩定性: 穩定

希爾排序

void ShellSort(vector<int>& nums)
{int n=nums.size();for(int gap=n/2;gap>0;gap/=2){for(int i=gap;i<n;i++){int key=nums[i],j=i-gap;while(j>=0&&nums[j]>key){nums[j+gap]=nums[j];j-=gap;}nums[j+gap]=key;}}
}
//算法原理: 插入排序的優化,按照gap為間隔,每次排序是預排序,使數組趨于有序化,當gap等于1時,才是真的排序 ? 
//時間復雜度: O(N^2)
//空間復雜度: O(1)
//穩定性: 不穩定

快速排序

快排思想:

int _QuickSort(vector<int> &nums, int left, int right)
{int key = left;left++;while (left <= right){while (left <= right && nums[left] < nums[key])left++;while (left <= right && nums[right] > nums[key])right--;if (left <= right)swap(nums[left++], nums[right--]);}swap(nums[key], nums[right]);return right;
}
void QuickSort(vector<int> &nums, int left, int right)
{if (left > right)return;int key = _QuickSort(nums, left, right);QuickSort(nums, left, key - 1);QuickSort(nums, key + 1, right);
}
//算法原理: 任取待排序元素中的某元素作為基準元素,使左邊元素都小于基準元素,右邊元素都大于基準元素,然后重復該過程,直到所有元素都
//       ? 排序完成。 ? 
//時間復雜度: O(NlogN)
//空間復雜度: O(logN)
//穩定性: 不穩定

歸并排序

void MergeSort(vector<int> &nums, int left, int right)
{if (left >= right) return;int mid = (left + right) >> 1;MergeSort(nums, left, mid);MergeSort(nums, mid + 1, right);vector<int> tmp(right-left+1);int cur1 = left, cur2 = mid + 1, i = 0;while (cur1 <= mid && cur2 <= right)tmp[i++] = nums[cur1] < nums[cur2] ? nums[cur1++] : nums[cur2++];while (cur1 <= mid)tmp[i++] = nums[cur1++];while (cur2 <= right)tmp[i++] = nums[cur2++];for (int i = left; i <= right; i++)nums[i] = tmp[i - left];
}
//算法原理: 將數組分為兩部分,不斷的遞歸,直到數組元素為1或者不能再分,然后合并兩個有序數組。 ? 
//時間復雜度: O(NlogN)
//空間復雜度: O(N)
//穩定性: 穩定

堆排序

void AdjustDown(vector<int>& nums,int n,int parent)
{int child=parent*2+1;while(child<n){if(child+1<n && nums[child+1]>nums[child]) child=child+1;if(nums[child]>nums[parent]){swap(nums[child],nums[parent]);parent=child;child=parent*2+1;}else{break;}}
}
void HeapSort(vector<int>& nums)
{int n=nums.size();//構建大根堆,從最后一個非葉子節點開始for(int i=(n-1-1)/2;i>=0;i--){AdjustDown(nums,n,i);}//排序int end=n-1;while(end>=0){swap(nums[0],nums[end]);AdjustDown(nums,end,0);end--;}
}
//算法原理: 先構建最大堆,然后交換堆頂元素和最后一個元素,這樣最后一個元素就是最大的了,然后再建堆,這樣不斷循環。
//時間復雜度: O(NlogN)
//空間復雜度: O(N)
//穩定性: 穩定

基數排序

void RadixSort(std::vector<int>& nums) {int maxVal=*max_element(nums.begin(),nums.end());int maxDigits=0;while(maxVal){maxVal/=10;maxDigits++;}vector<queue<int>> buckets(10);for(int i=0;i<maxDigits;i++){for(int num : nums){int bucketIndex=num/static_cast<int>(pow(10,i))%10;buckets[bucketIndex].push(num);}int index=0;for(auto& bucket : buckets){while(!bucket.empty()){nums[index++]=bucket.front();bucket.pop();}}}
}
//算法原理:  按照位數排序,按照位數把元素分配到對應的桶中,然后依據先進先出的順序再收集到數組中,這樣依次排個位,十位,百位。
//時間復雜度: O(NlogN)
//空間復雜度: O(N)
//穩定性: 穩定

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

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

相關文章

mlir-tblgen 的應用漸進式示例

示例01 -gen-dialect-decls toy_dia.1.toy include "mlir/IR/OpBase.td" //include "mlir/IR/FunctionInterfaces.td" //include "mlir/IR/SymbolInterfaces.td" //include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Diale…

Go語言從零構建SQL數據庫(5)-Pratt解析算法:SQL表達式解析的核心引擎

Pratt解析算法&#xff1a;SQL表達式解析的核心引擎 1. 算法概述與工作原理 Pratt解析算法&#xff08;自頂向下運算符優先級解析&#xff09;是一種優雅的表達式解析方法&#xff0c;特別適合處理具有不同優先級運算符的復雜表達式。在我們的SQL解析器中&#xff0c;它負責解…

spring-ai-openai調用Xinference1.4.1報錯

1、Xinference 報錯logs 此處是調用 /v1/chat/completions 接口 2025-04-06 15:48:51 xinference | return await dependant.call(**values) 2025-04-06 15:48:51 xinference | File "/usr/local/lib/python3.10/dist-packages/xinference/api/restful_api.py", …

刻意練習:如何從新手到大師

1. 練習方式 練習主要有兩類&#xff1a;天真的練習和刻意練習。 所謂“天真的練習”&#xff0c;基本上只是反復地做某些事情&#xff0c;并指望只靠那種反復&#xff0c;就能提高表現和水平。一旦某個人的表現達到了“可接受”的水平&#xff0c;并且可以做到自動化&#x…

基于Java的人臉識別在線考試系統(jsp+springboot+mysql8.x)

基于Java的人臉識別在線考試系統(jspspringbootmysql8.x) 在線考試系統提供全面的考試管理和用戶管理功能。登錄界面支持管理員、教師和學生三種身份驗證&#xff0c;確保不同用戶訪問相應的功能模塊。系統自動組卷功能允許管理員根據不同科目和題型&#xff0c;如單選題、多選…

預測分析(二):基于機器學習的數值預測

文章目錄 基于機器學習的數值預測機器學習簡介監督學習的任務創建第一個機器學習模型機器學習的目標——泛化過擬合現象評價函數與最優化 建模前的數據處理進一步特征變換 多元線性回歸模型LASSO回歸kNN算法原理算法步驟k值的選擇 基于機器學習的數值預測 機器學習是人工智能的…

批量壓縮 jpg/png 等格式照片|批量調整圖片的寬高尺寸

圖片格式種類非常的多&#xff0c;并且不同的圖片由于像素、尺寸不一樣&#xff0c;可能占用的空間也會不一樣。文件太大會占用較多的磁盤空間&#xff0c;傳輸及上傳系統都非常不方便&#xff0c;可能會收到限制&#xff0c;因此我們經常會碰到需要對圖片進行壓縮的需求。如何…

生鮮果蔬便利店實體零售門店商城小程序

——線上線下融合賦能社區零售新生態 隨著新零售模式的深化和消費者需求的升級&#xff0c;生鮮果蔬便利店亟需通過數字化工具實現經營效率與用戶體驗的雙重提升。結合線下實體門店與線上商城的一體化小程序&#xff0c;成為行業轉型的核心工具。以下從功能模塊、運營策略及行…

如何開通google Free Tier長期免費云服務器(1C/1G)

Google宣布的一項政策&#xff0c;為標準層級的網絡提供每地域200G的免費流量。兩項政策結合&#xff0c;于是便可以得到一臺1核心、1G內存、30G磁盤、200G流量的小云服務器&#xff0c;可玩性大大提高。這篇文章就分享一下如何正確開機&#xff0c;避免產生額外的費用。 免費…

C# 多線程并發編程基礎

1. 線程基礎 1.1 線程簡介 C# 中的線程是操作系統能夠進行運算調度的最小單位&#xff0c;它被包含在進程中&#xff0c;是進程中的實際運作單位。一個進程可以包含多個線程&#xff0c;這些線程可以并發執行不同的任務。 1.2 線程的創建與啟動 在 C# 中&#xff0c;可以使…

【Introduction to Reinforcement Learning】翻譯解讀2

2.2 馬爾可夫決策過程&#xff08;MDPs&#xff09; 馬爾可夫決策過程&#xff08;MDP&#xff09;為順序決策提供了框架&#xff0c;其中動作不僅影響即時獎勵&#xff0c;還會影響未來結果。與多臂老虎機問題不同&#xff0c;MDP中的即時獎勵與延遲獎勵相平衡。在多臂老虎機…

STM32單片機入門學習——第22節: [7-2] AD單通道AD多通道

寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難&#xff0c;但我還是想去做&#xff01; 本文寫于&#xff1a;2025.04.07 STM32開發板學習——第22節: [7-2] AD單通道&AD多通道 前言開發板說明引用解…

Python高階函數-filter

1. 基本概念 filter() 是Python內置的高階函數&#xff0c;用于過濾序列中的元素。它接收一個函數和一個可迭代對象作為參數&#xff0c;返回一個迭代器&#xff0c;包含使函數返回True的所有元素。 filter(function, iterable)2. 工作原理 惰性計算&#xff1a;filter對象是…

密碼學基礎——分組密碼的運行模式

前面的文章中文我們已經知道了分組密碼是一種對稱密鑰密碼體制&#xff0c;其工作原理可以概括為將明文消息分割成固定長度的分組&#xff0c;然后對每個分組分別進行加密處理。 下面介紹分組密碼的運行模式 1.電碼本模式&#xff08;ECB&#xff09; 2.密碼分組鏈接模式&…

Redlinux(2025.3.29)

1、將你的虛擬機的網卡模式設置為nat模式&#xff0c;給虛擬機網卡配置三個主機位分別為100、200、168的ip地址。(以nmtui命令為例) 2、測試你的虛擬機是否能夠ping通網關和dns&#xff0c;如果不能請修改網關和dns的地址。 首先打開虛擬網絡編輯器查看NAT設置里的網關IP&…

【PalladiumZ2 使用專欄 1 -- 波形 trigger 抓取詳細介紹】

文章目錄 Palladium Z2 OverviewPalladium 波形抓取Palladium 波形存放文件創建Palladium Trigger 斷點設置Palladium 加探針并 dumpPalladium 波形查看 Palladium Z2 Overview Cadence Palladium Z2 是 Cadence 推出的企業級硬件仿真加速平臺&#xff0c;旨在應對復雜 SoC 設…

Redisson分布式鎖:原理、使用

1. Redisson簡介 Redisson是一個基于Redis的Java客戶端庫&#xff0c;提供了豐富的分布式對象和服務&#xff08;如分布式鎖、信號量、Map等&#xff09;。其核心優勢在于??簡化分布式鎖的實現??&#xff0c;并解決了原生Redis分布式鎖的常見問題&#xff08;如死鎖、誤刪…

Java大廠面試題 -- JVM 優化進階之路:從原理到實戰的深度剖析(2)

最近佳作推薦&#xff1a; Java大廠面試題 – 深度揭秘 JVM 優化&#xff1a;六道面試題與行業巨頭實戰解析&#xff08;1&#xff09;&#xff08;New&#xff09; 開源架構與人工智能的融合&#xff1a;開啟技術新紀元&#xff08;New&#xff09; 開源架構的自動化測試策略優…

MySQL學習筆記(四)——DML和DQL

目錄 1. DML 1.1 添加數據 1.1.1 給指定字段添加數據 1.1.2 給全部字段添加數據 1.1.3 批量添加數據 1.2 修改數據 1.3 刪除數據 2. DQL 2.1 基本語法 2.2 基礎查詢 2.2.1 查詢多個字段 2.2.2 字段設置別名 2.2.3 去除重復記錄 2.3 條件查詢 2.4 聚合函數 2.5 …

DeepSeek-MLA

MLA 結構 需要緩存 KV 向量共用的壓縮隱特征K 向量多頭共享的帶位置編碼的向量 為什么帶有位置信息的 Q 向量來自于隱特征向量&#xff0c;而帶有位置的 K 向量來自于 H 向量且共享呢&#xff1f; 最好的方法肯定是從H向量直接計算并且不共享&#xff0c;但是會大大增加顯存使…