RM新时代网站-首页

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

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

3天內不再提示

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

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:C語言編程學習基地 ? 2021-09-29 17:47 ? 次閱讀

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

冒泡排序

冒泡排序思路:

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

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

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

4. 持續(xù)每次對越來越少的元素重復上面的步驟,直到?jīng)]有任何一對數(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]);}

// 模板實現(xiàn)冒泡排序template《typename T》 //整數(shù)或浮點數(shù)皆可使用,若要使用物件(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; // 發(fā)生交換則仍非有序 swap(v[j], v[j + 1]);

} } }}

選擇排序

選擇排序思路:

1. 在未排序序列中找到最?。ù螅┰兀娣诺脚判蛐蛄械钠鹗嘉恢?/p>

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

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

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

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. 選取第一個數(shù)為基準

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

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

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

}

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

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

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

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

}};template 《typename T》 // 整數(shù)或浮點數(shù)皆可使用,若要使用物件(class)時必須設定“小於”(《)、“大於”(》)、“不小於”(》=)的運算子功能void quick_sort(T arr[], const int len) { if (len 《= 0) return; // 避免len等於負值時宣告堆疊陣列當機 // 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ū))。從堆頂把根卸出來放在有序區(qū)之前,再恢復堆。

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

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

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

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

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

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

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

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

    關注

    22

    文章

    2108

    瀏覽量

    73618
  • 排序算法
    +關注

    關注

    0

    文章

    52

    瀏覽量

    10056

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

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

收藏 人收藏

    評論

    相關推薦

    C++新手容易犯的十個編程錯誤

    簡單的總結一下?C++ 新手容易犯的一些編程錯誤,給新人們提供一參考。 1 有些關鍵字在 cpp 文件多寫了 對于 C++ 類,一些關鍵字只要寫在 .h 中就好,cpp 中就不用再
    的頭像 發(fā)表于 11-15 12:42 ?309次閱讀

    C語言和C++結構體的區(qū)別

    同樣是結構體,看看在C語言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?199次閱讀

    時間復雜度為 O(n^2) 的排序算法

    作者:京東保險 王奕龍 對于小規(guī)模數(shù)據(jù),我們可以選用時間復雜度為 O(n2) 的排序算法。因為時間復雜度并不代表實際代碼的執(zhí)行時間,它省去了低階、系數(shù)和常數(shù),僅代表的增長趨勢,所以在小規(guī)模數(shù)據(jù)情況下
    的頭像 發(fā)表于 10-19 16:31 ?1137次閱讀
    時間復雜度為 O(n^2) 的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>

    ostream在c++的用法

    ostream 是 C++ 標準庫中一非常重要的類,它位于 頭文件(實際上,更常見的是通過包含 頭文件來間接包含 ,因為 包含了 和 )。 ostream 類及其派生類(如 std::cout
    的頭像 發(fā)表于 09-20 15:11 ?662次閱讀

    C++實現(xiàn)類似instanceof的方法

    C++有多態(tài)與繼承,但是很多人開始學習C++,有時候會面臨一常見問題,就是如何向下轉型,特別是不知道具體類型的時候,這個時候就希望C++ 可以向Java或者Python中有insta
    的頭像 發(fā)表于 07-18 10:16 ?573次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實現(xiàn)類似instanceof的方法

    手把手教你排序算法怎么寫

    新記錄插入。以{3,0,9,8,2}無序表按升序排列為例,有序表是一虛擬的順序表:1.插入排序剛開始,有序表沒有數(shù)據(jù),因此直接插入3即可。{3}2.插入0的時候要
    的頭像 發(fā)表于 06-04 08:03 ?681次閱讀
    手把手教你<b class='flag-5'>排序</b><b class='flag-5'>算法</b>怎么寫

    C/C++兩種宏實現(xiàn)方式

    #ifndef的方式受C/C++語言標準支持。它不僅可以保證同一文件不會被包含多次,也能保證內容完全相同的兩文件(或者代碼片段)不會被不小心同時包含。
    的頭像 發(fā)表于 04-19 11:50 ?605次閱讀

    STM32的ADC項目應用,用什么算法濾波和穩(wěn)定數(shù)據(jù)抖動?

    STM32的ADC項目應用,大家都用什么算法濾波和穩(wěn)定數(shù)據(jù)抖動。 ADC數(shù)據(jù)的抖動有時候應用在項目上讓人很是頭疼,什么度娘十大濾波算法也是要斟酌選用。 單片機項目設計,外設ADC的
    發(fā)表于 04-17 08:20

    鴻蒙OS開發(fā)實例:【Native C++

    使用DevEco Studio創(chuàng)建一Native C++應用。應用采用Native C++模板,實現(xiàn)使用NAPI調用C標準庫的功能。使用C
    的頭像 發(fā)表于 04-14 11:43 ?2591次閱讀
    鴻蒙OS開發(fā)實例:【Native <b class='flag-5'>C++</b>】

    華為助力華西天府醫(yī)院和江南大學附屬醫(yī)院榮獲2024年國醫(yī)院物聯(lián)網(wǎng)應用創(chuàng)新十大優(yōu)秀案例

    近日,在第屆全國醫(yī)院物聯(lián)網(wǎng)大會期間,“2024年度中國醫(yī)院物聯(lián)網(wǎng)應用創(chuàng)新十大優(yōu)秀案例”正式頒布,華為憑借臨床醫(yī)療物聯(lián)網(wǎng)和輔助物聯(lián)網(wǎng)醫(yī)療兩大物聯(lián)網(wǎng)解決方案,助力四川大學華西天府醫(yī)院和江南大學附屬醫(yī)院分別榮獲醫(yī)院管理類十大優(yōu)秀案例
    的頭像 發(fā)表于 04-03 09:30 ?636次閱讀

    使用 MISRA C++:2023? 避免基于范圍的 for 循環(huán)中的錯誤

    在前兩篇博客,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客,我們將仔細研究以 C++
    的頭像 發(fā)表于 03-28 13:53 ?783次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環(huán)中的錯誤

    FPGA實現(xiàn)雙調排序算法的探索與實踐

    雙調排序(BitonicSort)是數(shù)據(jù)獨立(Data-independent)的排序算法,即比較順序與數(shù)據(jù)無關,特別適合并行執(zhí)行。在了解雙調排序
    發(fā)表于 03-14 09:50 ?640次閱讀
    FPGA實現(xiàn)雙調<b class='flag-5'>排序</b><b class='flag-5'>算法</b>的探索與實踐

    C語言實現(xiàn)經(jīng)典排序算法概覽

    冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重復地走訪過要排序的數(shù)列,一次比較兩元素,如果他們的順序(如從大到小、首字
    的頭像 發(fā)表于 02-25 12:27 ?444次閱讀
    <b class='flag-5'>C</b>語言實現(xiàn)經(jīng)典<b class='flag-5'>排序</b><b class='flag-5'>算法</b>概覽

    計算機視覺的十大算法

    隨著科技的不斷發(fā)展,計算機視覺領域也取得了長足的進步。本文將介紹計算機視覺領域的十大算法,包括它們的基本原理、應用場景和優(yōu)缺點。這些算法在圖像處理、目標檢測、人臉識別等領域有著廣泛的應用,對計算機
    的頭像 發(fā)表于 02-19 13:26 ?1236次閱讀
    計算機視覺的<b class='flag-5'>十大</b><b class='flag-5'>算法</b>

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?581次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的
    RM新时代网站-首页