91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++中十大排序算法前五個(gè)詳解

C語(yǔ)言編程學(xué)習(xí)基地 ? 來(lái)源:C語(yǔ)言編程學(xué)習(xí)基地 ? 作者:C語(yǔ)言編程學(xué)習(xí)基地 ? 2021-09-29 17:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本期是C++基礎(chǔ)語(yǔ)法分享的第十五節(jié),今天給大家來(lái)梳理一下十大排序算法前五個(gè)!

冒泡排序

冒泡排序思路:

1. 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。

2. 對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是最大的數(shù)。

3. 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。

4. 持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。

示例:

void BubbleSort(vector《int》& v) { int len = v.size(); for (int i = 0; i 《 len - 1; ++i) for (int j = 0; j 《 len - 1 - i; ++j) if (v[j] 》 v[j + 1]) swap(v[j], v[j + 1]);}

// 模板實(shí)現(xiàn)冒泡排序template《typename T》 //整數(shù)或浮點(diǎn)數(shù)皆可使用,若要使用物件(class)時(shí)必須設(shè)定大於(》)的運(yùn)算子功能void bubble_sort(T arr[], int len) { for (int i = 0; i 《 len - 1; i++) for (int j = 0; j 《 len - 1 - i; j++) if (arr[j] 》 arr[j + 1]) swap(arr[j], arr[j + 1]);}

// 冒泡排序(改進(jìn)版)void BubbleSort_orderly(vector《int》& v) { int len = v.size(); bool orderly = false; for (int i = 0; i 《 len - 1 && !orderly; ++i) { orderly = true; for (int j = 0; j 《 len - 1 - i; ++j) { if (v[j] 》 v[j + 1]) { // 從小到大 orderly = false; // 發(fā)生交換則仍非有序 swap(v[j], v[j + 1]);

} } }}

選擇排序

選擇排序思路:

1. 在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置

2. 從剩余未排序元素中繼續(xù)尋找最?。ù螅┰兀缓蠓诺揭雅判蛐蛄械哪┪?/p>

3. 以此類推,直到所有元素均排序完畢

示例:

void SelectionSort(vector《int》& v) { int min, len = v.size(); for (int i = 0; i 《 len - 1; ++i) { min = i; for (int j = i + 1; j 《 len; ++j) { if (v[j] 《 v[min]) { // 標(biāo)記最小的 min = j; } } if (i != min) // 交換到前面 swap(v[i], v[min]); }}

// 模板實(shí)現(xiàn)template《typename T》 void Selection_Sort(std::vector《T》& arr) { int len = arr.size();

for (int i = 0; i 《 len - 1; i++) { int min = i; for (int j = i + 1; j 《 len; j++) if (arr[j] 《 arr[min]) min = j; if(i != min) std::swap(arr[i], arr[min]); }}

插入排序

插入排序思路:

1. 從第一個(gè)元素開(kāi)始,該元素可以認(rèn)為已經(jīng)被排序

2. 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描

3. 如果該元素(已排序)大于新元素,將該元素移到下一位置

4. 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置

5. 將新元素插入到該位置后

6. 重復(fù)步驟2~5

示例:

void InsertSort(vector《int》& v){ int len = v.size(); for (int i = 1; i 《 len; ++i) { int temp = v[i]; for(int j = i - 1;

j 》= 0; --j) { if(v[j] 》 temp) { v[j + 1] = v[j]; v[j] = temp; } else break; } }}

快速排序

快速排序思路:

1. 選取第一個(gè)數(shù)為基準(zhǔn)

2. 將比基準(zhǔn)小的數(shù)交換到前面,比基準(zhǔn)大的數(shù)交換到后面

3. 對(duì)左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個(gè)數(shù)

void QuickSort(vector《int》& v, int low, int high) { if (low 》= high) // 結(jié)束標(biāo)志 return; int first = low; // 低位下標(biāo) int last = high; // 高位下標(biāo) int key = v[first]; // 設(shè)第一個(gè)為基準(zhǔn)

while (first 《 last) { // 將比第一個(gè)小的移到前面 while (first 《 last && v[last] 》= key) last--; if (first 《 last) v[first++] = v[last];

// 將比第一個(gè)大的移到后面 while (first 《 last && v[first] 《= key) first++; if (first 《 last) v[last--] = v[first]; } // 基準(zhǔn)置位 v[first] = key; // 前半遞歸 QuickSort(v, low, first - 1); // 后半遞歸 QuickSort(v, first + 1, high);

}

// ----------------------------------------------------

// 模板實(shí)現(xiàn)快速排序(遞歸)template 《typename T》void quick_sort_recursive(T arr[], int start, int end) { if (start 》= end) return; T mid = arr[end];

int left = start, right = end - 1; while (left 《 right) { while (arr[left] 《 mid && left 《 right) left++; while (arr[right] 》= mid && left 《 right) right--; std::swap(arr[left], arr[right]); } if (arr[left] 》= arr[end]) std::swap(arr[left], arr[end]); else left++; quick_sort_recursive(arr, start, left - 1);

quick_sort_recursive(arr, left + 1, end);}template 《typename T》 //整數(shù)或浮點(diǎn)數(shù)皆可使用,若要使用物件(class)時(shí)必須設(shè)定“小於”(《)、“大於”(》)、“不小於”(》=)的運(yùn)算子功能void quick_sort(T arr[], int len) { quick_sort_recursive(arr, 0, len - 1);}

// ----------------------------------------------------

// 模板實(shí)現(xiàn)快速排序(迭代)struct Range { int start, end; Range(int s = 0, int e = 0) { start = s, end = e;

}};template 《typename T》 // 整數(shù)或浮點(diǎn)數(shù)皆可使用,若要使用物件(class)時(shí)必須設(shè)定“小於”(《)、“大於”(》)、“不小於”(》=)的運(yùn)算子功能void quick_sort(T arr[], const int len) { if (len 《= 0) return; // 避免len等於負(fù)值時(shí)宣告堆疊陣列當(dāng)機(jī) // r[]模擬堆疊,p為數(shù)量,r[p++]為push,r[--p]為pop且取得元素 Range r[len];

int p = 0; r[p++] = Range(0, len - 1); while (p) { Range range = r[--p]; if (range.start 》= range.end) continue; T mid = arr[range.end]; int left = range.start, right = range.end - 1;

while (left 《 right) { while (arr[left] 《 mid && left 《 right) left++; while (arr[right] 》= mid && left 《 right) right--; std::swap(arr[left], arr[right]);

} if (arr[left] 》= arr[range.end]) std::swap(arr[left], arr[range.end]); else left++; r[p++] = Range(range.start, left - 1); r[p++] = Range(left + 1, range.end); }}

堆排序

堆排序:(最大堆,有序區(qū))。從堆頂把根卸出來(lái)放在有序區(qū)之前,再恢復(fù)堆。

#include 《iostream》#include 《algorithm》using namespace std;

// 堆排序:(最大堆,有序區(qū))。從堆頂把根卸出來(lái)放在有序區(qū)之前,再恢復(fù)堆。

void max_heapify(int arr[], int start, int end) { //建立父節(jié)點(diǎn)指標(biāo)和子節(jié)點(diǎn)指標(biāo) int dad = start; int son = dad * 2 + 1; while (son 《= end) {

//若子節(jié)點(diǎn)指標(biāo)在範(fàn)圍內(nèi)才做比較 if (son + 1 《= end && arr[son] 《 arr[son + 1])

//先比較兩個(gè)子節(jié)點(diǎn)大小,選擇最大的 son++; if (arr[dad] 》 arr[son]) //如果父節(jié)點(diǎn)大於子節(jié)點(diǎn)代表調(diào)整完畢,直接跳出函數(shù) return; else { //否則交換父子內(nèi)容再繼續(xù)子節(jié)點(diǎn)和孫節(jié)點(diǎn)比較 swap(arr[dad], arr[son]); dad = son; son = dad * 2 + 1; } }}

void heap_sort(int arr[], int len) { //初始化,i從最後一個(gè)父節(jié)點(diǎn)開(kāi)始調(diào)整 for (int i = len / 2 - 1; i 》= 0; i--) max_heapify(arr, i, len - 1);

//先將第一個(gè)元素和已經(jīng)排好的元素前一位做交換,再?gòu)男抡{(diào)整(剛調(diào)整的元素之前的元素),直到排序完畢 for (int i = len - 1; i 》 0; i--) { swap(arr[0], arr[i]); max_heapify(arr, 0, i - 1); }}

int main() { int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };

int len = (int) sizeof(arr) / sizeof(*arr); heap_sort(arr, len); for (int i = 0; i 《 len; i++) cout 《《 arr[i] 《《 ‘ ’; cout 《《 endl; return 0;}

今天的分享就到這里了,大家要好好學(xué)C++喲~

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2124

    瀏覽量

    77139
  • 排序算法
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    10429

原文標(biāo)題:C++基礎(chǔ)語(yǔ)法梳理:算法丨十大排序算法(一)

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    單片機(jī)ADC采樣算法-中位值平均濾波法

    中位值平均濾波法濾波法就是通過(guò)連續(xù)采樣N個(gè)數(shù)據(jù),然后對(duì)數(shù)據(jù)從小到大排序,然后去掉最大值和最小值,對(duì)剩余的N-2個(gè)值計(jì)算算數(shù)平均值。也就是中位值濾波和算數(shù)平均濾波的結(jié)合。 下面看C代碼的實(shí)現(xiàn)
    發(fā)表于 01-22 06:17

    廣電計(jì)量獲評(píng)2025年度十大信創(chuàng)測(cè)評(píng)機(jī)構(gòu)

    近日,第屆信創(chuàng)系列評(píng)選結(jié)果正式揭曉。廣電計(jì)量(股票代碼:002967)憑借信創(chuàng)測(cè)評(píng)領(lǐng)域的全鏈條資質(zhì)優(yōu)勢(shì)、深厚技術(shù)沉淀與卓越行業(yè)口碑,從全國(guó)27個(gè)省市的126家申報(bào)機(jī)構(gòu)脫穎而出,成功摘得“2025年度
    的頭像 發(fā)表于 01-15 16:38 ?279次閱讀

    C語(yǔ)言插入排序算法和代碼

    插入排序排序算法的一種,它不改變?cè)械男蛄?數(shù)組),而是創(chuàng)建一個(gè)新的序列,在新序列上進(jìn)行操作。   這里以從小到大排序為例進(jìn)行講解。
    發(fā)表于 01-15 06:44

    FPGA DSP模塊使用十大關(guān)鍵陷阱

    FPGA 芯片中DSP(數(shù)字信號(hào)處理)硬核是高性能計(jì)算的核心資源,但使用不當(dāng)會(huì)引入隱蔽性極強(qiáng)的“坑”。這些坑不僅影響性能和精度,甚至?xí)?dǎo)致功能錯(cuò)誤。以下是總結(jié)了十大關(guān)鍵陷阱及其解決方案,分為 功能正確性、性能優(yōu)化、系統(tǒng)集成 三個(gè)層面。
    的頭像 發(fā)表于 01-13 15:18 ?380次閱讀

    C語(yǔ)言與C++的區(qū)別及聯(lián)系

    缺點(diǎn):性能比面向過(guò)程低。 二、具體語(yǔ)言上的區(qū)別 1、關(guān)鍵字的不同 C語(yǔ)言有32個(gè)關(guān)鍵字;C++有63個(gè)關(guān)鍵字。 2、后綴名不同 C
    發(fā)表于 12-24 07:23

    C語(yǔ)言和C++之間的區(qū)別是什么

    區(qū)別 1、面向?qū)ο缶幊?(OOP): C語(yǔ)言是一種面向過(guò)程的語(yǔ)言,它強(qiáng)調(diào)的是通過(guò)函數(shù)將任務(wù)分解為一系列步驟進(jìn)行執(zhí)行。 C++C語(yǔ)言的基礎(chǔ)上擴(kuò)展了面向?qū)ο蟮奶匦?,支持?class)、封裝、繼承
    發(fā)表于 12-11 06:23

    C++程序異常的處理機(jī)制

    1、什么是異常處理? 有經(jīng)驗(yàn)的朋友應(yīng)該知道,在正常的CC++編程過(guò)程難免會(huì)碰到程序不按照原本設(shè)計(jì)運(yùn)行的情況。 最常見(jiàn)的有除法分母為零,數(shù)組越界,內(nèi)存分配失效、打開(kāi)相應(yīng)文件失敗等等。 一
    發(fā)表于 12-02 07:12

    C語(yǔ)言的常見(jiàn)算法

    # C語(yǔ)言常見(jiàn)算法 C語(yǔ)言中常用的算法可以分為以下幾大類: ## 1. 排序算法 ###
    發(fā)表于 11-24 08:29

    國(guó)產(chǎn)海光 OPS 電腦十大排

    國(guó)產(chǎn)海光OPS電腦的市場(chǎng)競(jìng)爭(zhēng)已從單一參數(shù)比拼,轉(zhuǎn)向“性能+適配+服務(wù)+口碑”的綜合實(shí)力競(jìng)爭(zhēng)。本次十大排名基于產(chǎn)品性能、適配兼容性、品牌實(shí)力、行業(yè)案例、客戶口碑大核心維度,通過(guò)第三方數(shù)據(jù)調(diào)研、客戶
    的頭像 發(fā)表于 11-21 09:25 ?957次閱讀
    國(guó)產(chǎn)海光 OPS 電腦<b class='flag-5'>十大排</b>名

    OPS 電腦廠家十大排名榜:2025年最新榜單

    在OPS電腦采購(gòu),“選對(duì)廠家”直接決定設(shè)備穩(wěn)定性、適配效率與長(zhǎng)期運(yùn)維成本。本次OPS電腦廠家十大排名榜,基于研發(fā)實(shí)力、生產(chǎn)規(guī)模、品牌合作背書(shū)、售后保障、場(chǎng)景落地能力大核心維度綜合評(píng)測(cè),所有數(shù)據(jù)均
    的頭像 發(fā)表于 10-16 16:24 ?1709次閱讀
    OPS 電腦廠家<b class='flag-5'>十大排</b>名榜:2025年最新榜單

    易云物聯(lián)網(wǎng)平臺(tái)的十大功能

    在數(shù)字經(jīng)濟(jì)與產(chǎn)業(yè)智能化深度融合的浪潮下,易云物聯(lián)網(wǎng)平臺(tái)以構(gòu)建了一站式智能化管理生態(tài)。平臺(tái)通過(guò)整合物聯(lián)網(wǎng)、云計(jì)算與大數(shù)據(jù)技術(shù),打破傳統(tǒng)產(chǎn)業(yè)數(shù)據(jù)孤島,為企業(yè)提供從底層設(shè)備連接到頂層決策分析的全鏈路賦能。接下來(lái)讓我們走進(jìn)易云平臺(tái)十大
    的頭像 發(fā)表于 07-25 16:33 ?984次閱讀

    永貴科技榮獲2025國(guó)充換電行業(yè)十大充電槍品牌

    在5月13號(hào)剛剛落幕的2025國(guó)充換電行業(yè)十大品牌評(píng)選頒獎(jiǎng)典禮上。永貴科技憑借卓越的技術(shù)實(shí)力與市場(chǎng)口碑,榮獲“2025國(guó)充換電行業(yè)十大充電槍品牌”稱號(hào)。
    的頭像 發(fā)表于 05-22 14:11 ?1072次閱讀

    乘光而上,載譽(yù)前行|度亙核芯斬獲“2024國(guó)十大光學(xué)產(chǎn)業(yè)技術(shù)獎(jiǎng)”!

    5月15日,“2025國(guó)十大光學(xué)產(chǎn)業(yè)技術(shù)頒獎(jiǎng)典禮暨產(chǎn)業(yè)創(chuàng)新大會(huì)”在武漢光谷隆重舉行。度亙核芯自主研發(fā)的“高功率高效率976nmDFB鎖波芯片”經(jīng)行業(yè)權(quán)威評(píng)審委員會(huì)嚴(yán)格評(píng)審、網(wǎng)絡(luò)投票等多維度綜合評(píng)選
    的頭像 發(fā)表于 05-16 17:45 ?1485次閱讀
    乘光而上,載譽(yù)前行|度亙核芯斬獲“2024<b class='flag-5'>中</b>國(guó)<b class='flag-5'>十大</b>光學(xué)產(chǎn)業(yè)技術(shù)獎(jiǎng)”!

    工業(yè)路由器品牌十大排

    、產(chǎn)品覆蓋廣泛的企業(yè)。本文結(jié)合行業(yè)權(quán)威榜單與市場(chǎng)動(dòng)態(tài),梳理2024-2025年工業(yè)路由器品牌十大排名(排名不分先后) 一、品牌綜合實(shí)力與產(chǎn)品特點(diǎn) 1. 星創(chuàng)易聯(lián) 星創(chuàng)易聯(lián)憑借高性能處理器與多協(xié)議兼容性穩(wěn)居國(guó)內(nèi)工業(yè)路由器市場(chǎng)前列。其產(chǎn)
    的頭像 發(fā)表于 03-27 16:21 ?2649次閱讀

    C++學(xué)到什么程度可以找工作?

    C++學(xué)到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開(kāi)發(fā)人員或相關(guān)職位,通常需要掌握以下幾個(gè)方面: 1. **語(yǔ)言基礎(chǔ)**:你需要對(duì)C++的核心概念有扎實(shí)的理解,包括但不限于指針、內(nèi)存
    發(fā)表于 03-13 10:19