国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++中十大排序算法前五個詳解

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:C語言編程學習基地 ? 2021-09-29 17:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本期是C++基礎語法分享的第十五節,今天給大家來梳理一下十大排序算法前五個!

冒泡排序

冒泡排序思路:

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

2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。

3. 針對所有的元素重復以上的步驟,除了最后一個。

4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

示例:

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]);}

// 模板實現冒泡排序template《typename T》 //整數或浮點數皆可使用,若要使用物件(class)時必須設定大於(》)的運算子功能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]);}

// 冒泡排序(改進版)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; // 發生交換則仍非有序 swap(v[j], v[j + 1]);

} } }}

選擇排序

選擇排序思路:

1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

2. 從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾

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]) { // 標記最小的 min = j; } } if (i != min) // 交換到前面 swap(v[i], v[min]); }}

// 模板實現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. 從第一個元素開始,該元素可以認為已經被排序

2. 取出下一個元素,在已經排序的元素序列中從后向前掃描

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

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

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

6. 重復步驟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. 選取第一個數為基準

2. 將比基準小的數交換到前面,比基準大的數交換到后面

3. 對左右區間重復第二步,直到各區間只有一個數

void QuickSort(vector《int》& v, int low, int high) { if (low 》= high) // 結束標志 return; int first = low; // 低位下標 int last = high; // 高位下標 int key = v[first]; // 設第一個為基準

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

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

}

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

// 模板實現快速排序(遞歸)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》 //整數或浮點數皆可使用,若要使用物件(class)時必須設定“小於”(《)、“大於”(》)、“不小於”(》=)的運算子功能void quick_sort(T arr[], int len) { quick_sort_recursive(arr, 0, len - 1);}

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

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

}};template 《typename T》 // 整數或浮點數皆可使用,若要使用物件(class)時必須設定“小於”(《)、“大於”(》)、“不小於”(》=)的運算子功能void quick_sort(T arr[], const int len) { if (len 《= 0) return; // 避免len等於負值時宣告堆疊陣列當機 // r[]模擬堆疊,p為數量,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); }}

堆排序

堆排序:(最大堆,有序區)。從堆頂把根卸出來放在有序區之前,再恢復堆。

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

// 堆排序:(最大堆,有序區)。從堆頂把根卸出來放在有序區之前,再恢復堆。

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

//若子節點指標在範圍內才做比較 if (son + 1 《= end && arr[son] 《 arr[son + 1])

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

void heap_sort(int arr[], int len) { //初始化,i從最後一個父節點開始調整 for (int i = len / 2 - 1; i 》= 0; i--) max_heapify(arr, i, len - 1);

//先將第一個元素和已經排好的元素前一位做交換,再從新調整(剛調整的元素之前的元素),直到排序完畢 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;}

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

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C++
    C++
    +關注

    關注

    22

    文章

    2123

    瀏覽量

    77110
  • 排序算法
    +關注

    關注

    0

    文章

    53

    瀏覽量

    10426

原文標題:C++基礎語法梳理:算法丨十大排序算法(一)

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

    中位值平均濾波法濾波法就是通過連續采樣N個數據,然后對數據從小到大排序,然后去掉最大值和最小值,對剩余的N-2值計算算數平均值。也就是中位值濾波和算數平均濾波的結合。 下面看C代碼的實現
    發表于 01-22 06:17

    廣電計量獲評2025年度十大信創測評機構

    近日,第屆信創系列評選結果正式揭曉。廣電計量(股票代碼:002967)憑借信創測評領域的全鏈條資質優勢、深厚技術沉淀與卓越行業口碑,從全國27省市的126家申報機構脫穎而出,成功摘得“2025年度
    的頭像 發表于 01-15 16:38 ?268次閱讀

    C語言插入排序算法和代碼

    插入排序排序算法的一種,它不改變原有的序列(數組),而是創建一新的序列,在新序列上進行操作。   這里以從小到大排序為例進行講解。
    發表于 01-15 06:44

    FPGA DSP模塊使用十大關鍵陷阱

    FPGA 芯片中DSP(數字信號處理)硬核是高性能計算的核心資源,但使用不當會引入隱蔽性極強的“坑”。這些坑不僅影響性能和精度,甚至會導致功能錯誤。以下是總結了十大關鍵陷阱及其解決方案,分為 功能正確性、性能優化、系統集成 三層面。
    的頭像 發表于 01-13 15:18 ?357次閱讀

    C語言與C++的區別及聯系

    缺點:性能比面向過程低。 二、具體語言上的區別 1、關鍵字的不同 C語言有32關鍵字;C++有63關鍵字。 2、后綴名不同 C
    發表于 12-24 07:23

    C語言和C++之間的區別是什么

    區別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數將任務分解為一系列步驟進行執行。 C++C語言的基礎上擴展了面向對象的特性,支持類(class)、封裝、繼承
    發表于 12-11 06:23

    C++程序異常的處理機制

    1、什么是異常處理? 有經驗的朋友應該知道,在正常的CC++編程過程難免會碰到程序不按照原本設計運行的情況。 最常見的有除法分母為零,數組越界,內存分配失效、打開相應文件失敗等等。 一
    發表于 12-02 07:12

    C語言的常見算法

    # C語言常見算法 C語言中常用的算法可以分為以下幾大類: ## 1. 排序算法 ###
    發表于 11-24 08:29

    國產海光 OPS 電腦十大排

    國產海光OPS電腦的市場競爭已從單一參數比拼,轉向“性能+適配+服務+口碑”的綜合實力競爭。本次十大排名基于產品性能、適配兼容性、品牌實力、行業案例、客戶口碑大核心維度,通過第三方數據調研、客戶
    的頭像 發表于 11-21 09:25 ?931次閱讀
    國產海光 OPS 電腦<b class='flag-5'>十大排</b>名

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

    在OPS電腦采購,“選對廠家”直接決定設備穩定性、適配效率與長期運維成本。本次OPS電腦廠家十大排名榜,基于研發實力、生產規模、品牌合作背書、售后保障、場景落地能力大核心維度綜合評測,所有數據均
    的頭像 發表于 10-16 16:24 ?1671次閱讀
    OPS 電腦廠家<b class='flag-5'>十大排</b>名榜:2025年最新榜單

    易云物聯網平臺的十大功能

    在數字經濟與產業智能化深度融合的浪潮下,易云物聯網平臺以構建了一站式智能化管理生態。平臺通過整合物聯網、云計算與大數據技術,打破傳統產業數據孤島,為企業提供從底層設備連接到頂層決策分析的全鏈路賦能。接下來讓我們走進易云平臺十大
    的頭像 發表于 07-25 16:33 ?970次閱讀

    永貴科技榮獲2025國充換電行業十大充電槍品牌

    在5月13號剛剛落幕的2025國充換電行業十大品牌評選頒獎典禮上。永貴科技憑借卓越的技術實力與市場口碑,榮獲“2025國充換電行業十大充電槍品牌”稱號。
    的頭像 發表于 05-22 14:11 ?1060次閱讀

    乘光而上,載譽前行|度亙核芯斬獲“2024十大光學產業技術獎”!

    5月15日,“2025十大光學產業技術頒獎典禮暨產業創新大會”在武漢光谷隆重舉行。度亙核芯自主研發的“高功率高效率976nmDFB鎖波芯片”經行業權威評審委員會嚴格評審、網絡投票等多維度綜合評選
    的頭像 發表于 05-16 17:45 ?1481次閱讀
    乘光而上,載譽前行|度亙核芯斬獲“2024<b class='flag-5'>中</b>國<b class='flag-5'>十大</b>光學產業技術獎”!

    工業路由器品牌十大排

    、產品覆蓋廣泛的企業。本文結合行業權威榜單與市場動態,梳理2024-2025年工業路由器品牌十大排名(排名不分先后) 一、品牌綜合實力與產品特點 1. 星創易聯 星創易聯憑借高性能處理器與多協議兼容性穩居國內工業路由器市場前列。其產
    的頭像 發表于 03-27 16:21 ?2603次閱讀

    C++學到什么程度可以找工作?

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