0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(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)容及配圖由入駐作者撰寫或者入駐合作網(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)注

    21

    文章

    2090

    瀏覽量

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

    關(guān)注

    0

    文章

    52

    瀏覽量

    10045

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    ostream在c++的用法

    ostream 是 C++ 標(biāo)準(zhǔn)庫(kù)中一個(gè)非常重要的類,它位于 頭文件(實(shí)際上,更常見(jiàn)的是通過(guò)包含 頭文件來(lái)間接包含 ,因?yàn)?包含了 和 )。 ostream 類及其派生類(如 std::cout
    的頭像 發(fā)表于 09-20 15:11 ?278次閱讀

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

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

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

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

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

    使用DevEco Studio創(chuàng)建一個(gè)Native C++應(yīng)用。應(yīng)用采用Native C++模板,實(shí)現(xiàn)使用NAPI調(diào)用C標(biāo)準(zhǔn)庫(kù)的功能。使用C
    的頭像 發(fā)表于 04-14 11:43 ?2345次閱讀
    鴻蒙OS開(kāi)發(fā)實(shí)例:【Native <b class='flag-5'>C++</b>】

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

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

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

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

    計(jì)算機(jī)視覺(jué)的十大算法

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

    C++簡(jiǎn)史:C++是如何開(kāi)始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本,來(lái)了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?481次閱讀
    <b class='flag-5'>C++</b>簡(jiǎn)史:<b class='flag-5'>C++</b>是如何開(kāi)始的

    十大排序算法總結(jié)

    排序算法是最經(jīng)典的算法知識(shí)。因?yàn)槠鋵?shí)現(xiàn)代碼短,應(yīng)該廣,在面試中經(jīng)常會(huì)問(wèn)到排序算法及其相關(guān)的問(wèn)題。一般在面試中最??嫉氖强焖?/div>
    的頭像 發(fā)表于 12-20 10:39 ?1044次閱讀

    C語(yǔ)言和C++那些不同的地方

    C語(yǔ)言雖說(shuō)經(jīng)常和C++在一起被大家提起,但可千萬(wàn)不要以為它們是一個(gè)東西。現(xiàn)在我們常用的C語(yǔ)言是C89標(biāo)準(zhǔn),
    的頭像 發(fā)表于 12-07 14:29 ?849次閱讀
    <b class='flag-5'>C</b>語(yǔ)言和<b class='flag-5'>C++</b><b class='flag-5'>中</b>那些不同的地方

    c++多行注釋快捷鍵

    C++,多行注釋(也稱為塊注釋)是一種用于注釋大段代碼或多個(gè)語(yǔ)句的方法。當(dāng)你希望暫時(shí)禁用一些代碼或者解釋特定部分代碼的作用時(shí),多行注釋是非常有用的。 在C++,多行注釋以 /*
    的頭像 發(fā)表于 11-22 10:24 ?7480次閱讀

    機(jī)器學(xué)習(xí)的基本流程和十大算法

    為了進(jìn)行機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘任務(wù),數(shù)據(jù)科學(xué)家們提出了各種模型,在眾多的數(shù)據(jù)挖掘模型,國(guó)際權(quán)威的學(xué)術(shù)組織 ICDM(the IEEE International Conference on Data Mining)評(píng)選出了十大經(jīng)典的算法
    發(fā)表于 10-31 11:30 ?922次閱讀
    機(jī)器學(xué)習(xí)的基本流程和<b class='flag-5'>十大</b><b class='flag-5'>算法</b>

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問(wèn)題,讓大家領(lǐng)略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++,C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《C++之旅》!
    的頭像 發(fā)表于 10-30 16:35 ?743次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖

    單片機(jī)ADC,十大C語(yǔ)言濾波算法

    單片機(jī)ADC,十大C語(yǔ)言濾波算法
    的頭像 發(fā)表于 10-24 15:53 ?1109次閱讀