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++基礎(chǔ)語(yǔ)法十大排序算法后五個(gè)分享

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

掃碼添加小助手

加入工程師交流群

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

a9519302-2426-11ec-82a8-dac502259ad0.png

歸并排序

歸并排序:把數(shù)據(jù)分為兩段,從兩段中逐個(gè)選最小的元素移入新數(shù)據(jù)段的末尾??蓮纳系较禄驈南碌缴线M(jìn)行。

/***************** 迭代版*****************

///整數(shù)或浮點(diǎn)數(shù)皆可使用,若要使用物件(class)時(shí)必須設(shè)定“小於”(《)的運(yùn)算子功能template《typename T》void merge_sort(T arr[], int len) { T* a = arr;

T* b = new T[len]; for (int seg = 1;

seg 《 len; seg += seg) { for (int start = 0; start 《 len; start += seg + seg) { int low = start, mid = min(start + seg, len), high = min(start + seg + seg, len);

int k = low; int start1 = low, end1 = mid; int start2 = mid, end2 = high; while (start1 《 end1 && start2 《 end2) b[k++] = a[start1] 《 a[start2] ? a[start1++] : a[start2++]; while (start1 《 end1) b[k++] = a[start1++];

while (start2 《 end2) b[k++] = a[start2++]; } T* temp = a;

a = b; b = temp; } if (a != arr) { for (int i = 0; i 《 len; i++) b[i] = a[i]; b = a;

} delete[] b;}

/***************** 遞歸版*****************/template《typename T》void merge_sort_recursive(T arr[], T reg[], int start, int end) { if (start 》= end) return; int len = end - start, mid = (len 》》 1) + start; int start1 = start, end1 = mid;

int start2 = mid + 1, end2 = end; merge_sort_recursive(arr, reg, start1, end1); merge_sort_recursive(arr, reg, start2, end2);

int k = start; while (start1 《= end1 && start2 《= end2) reg[k++] = arr[start1] 《 arr[start2] ? arr[start1++] : arr[start2++];

while (start1 《= end1) reg[k++] = arr[start1++]; while (start2 《= end2) reg[k++] = arr[start2++];

for (k = start; k 《= end; k++) arr[k] = reg[k];}//整數(shù)或浮點(diǎn)數(shù)皆可使用,若要使用物件(class)時(shí)必須設(shè)定“小於”(《)的運(yùn)算子功能template《typename T》 void merge_sort(T arr[], const int len) { T *reg = new T[len]; merge_sort_recursive(arr, reg, 0, len - 1); delete[] reg;}

希爾排序

希爾排序:每一輪按照事先決定的間隔進(jìn)行插入排序,間隔會(huì)依次縮小,最后一次一定要是1。

template《typename T》void shell_sort(T array[], int length) { int h = 1; while (h 《 length / 3) { h = 3 * h + 1; } while (h 》= 1) { for (int i = h; i 《 length; i++) { for (int j = i; j 》= h && array[j] 《 array[j - h]; j -= h) { std::swap(array[j], array[j - h]); } } h = h / 3; }}

計(jì)數(shù)排序

計(jì)數(shù)排序:統(tǒng)計(jì)小于等于該元素值的元素的個(gè)數(shù)i,于是該元素就放在目標(biāo)數(shù)組的索引i位(i≥0)。

計(jì)數(shù)排序基于一個(gè)假設(shè),待排序數(shù)列的所有數(shù)均為整數(shù),且出現(xiàn)在(0,k)的區(qū)間之內(nèi)。

如果 k(待排數(shù)組的最大值) 過(guò)大則會(huì)引起較大的空間復(fù)雜度,一般是用來(lái)排序 0 到 100 之間的數(shù)字的最好的算法,但是它不適合按字母順序排序人名。

計(jì)數(shù)排序不是比較排序,排序的速度快于任何比較排序算法。

時(shí)間復(fù)雜度為 O(n+k),空間復(fù)雜度為 O(n+k)

算法的步驟如下:

1. 找出待排序的數(shù)組中最大和最小的元素

2. 統(tǒng)計(jì)數(shù)組中每個(gè)值為 i 的元素出現(xiàn)的次數(shù),存入數(shù)組 C 的第 i 項(xiàng)

3. 對(duì)所有的計(jì)數(shù)累加(從 C 中的第一個(gè)元素開(kāi)始,每一項(xiàng)和前一項(xiàng)相加)

4. 反向填充目標(biāo)數(shù)組:將每個(gè)元素 i 放在新數(shù)組的第 C[i] 項(xiàng),每放一個(gè)元素就將 C[i] 減去 1

#include 《iostream》#include 《vector》#include 《algorithm》

using namespace std;

// 計(jì)數(shù)排序void CountSort(vector《int》& vecRaw, vector《int》& vecObj){ // 確保待排序容器非空 if (vecRaw.size() == 0) return;

// 使用 vecRaw 的最大值 + 1 作為計(jì)數(shù)容器 countVec 的大小 int vecCountLength = (*max_element(begin(vecRaw), end(vecRaw))) + 1; vector《int》 vecCount(vecCountLength, 0);

// 統(tǒng)計(jì)每個(gè)鍵值出現(xiàn)的次數(shù) for (int i = 0; i 《 vecRaw.size(); i++) vecCount[vecRaw[i]]++; // 后面的鍵值出現(xiàn)的位置為前面所有鍵值出現(xiàn)的次數(shù)之和 for (int i = 1; i 《 vecCountLength; i++) vecCount[i] += vecCount[i - 1];

// 將鍵值放到目標(biāo)位置 for (int i = vecRaw.size(); i 》 0; i--) // 此處逆序是為了保持相同鍵值的穩(wěn)定性 vecObj[--vecCount[vecRaw[i - 1]]] = vecRaw[i - 1];}

int main(){ vector《int》 vecRaw = { 0,5,7,9,6,3,4,5,2,8,6,9,2,1 }; vector《int》 vecObj(vecRaw.size(), 0);

CountSort(vecRaw, vecObj);

for (int i = 0; i 《 vecObj.size(); ++i) cout 《《 vecObj[i] 《《 “ ”; cout 《《 endl;

return 0;}

桶排序

桶排序:將值為i的元素放入i號(hào)桶,最后依次把桶里的元素倒出來(lái)。

桶排序序思路:

1. 設(shè)置一個(gè)定量的數(shù)組當(dāng)作空桶子。

2. 尋訪序列,并且把項(xiàng)目一個(gè)一個(gè)放到對(duì)應(yīng)的桶子去。

3. 對(duì)每個(gè)不是空的桶子進(jìn)行排序。

4. 從不是空的桶子里把項(xiàng)目再放回原來(lái)的序列中。

假設(shè)數(shù)據(jù)分布在[0,100)之間,每個(gè)桶內(nèi)部用鏈表表示,在數(shù)據(jù)入桶的同時(shí)插入排序,然后把各個(gè)桶中的數(shù)據(jù)合并。

const int BUCKET_NUM = 10;

struct ListNode{ explicit ListNode(int i=0):mData(i),mNext(NULL){} ListNode* mNext; int mData;};

ListNode* insert(ListNode* head,int val){ ListNode dummyNode; ListNode *newNode = new ListNode(val); ListNode *pre,*curr; dummyNode.mNext = head; pre = &dummyNode; curr = head; while(NULL!=curr && curr-》mData《=val){ pre = curr; curr = curr-》mNext; } newNode-》mNext = curr; pre-》mNext = newNode; return dummyNode.mNext;}

ListNode* Merge(ListNode *head1,ListNode *head2){ ListNode dummyNode; ListNode *dummy = &dummyNode; while(NULL!=head1 && NULL!=head2){ if(head1-》mData 《= head2-》mData){ dummy-》mNext = head1; head1 = head1-》mNext; }else{ dummy-》mNext = head2; head2 = head2-》mNext; } dummy = dummy-》mNext; } if(NULL!=head1) dummy-》mNext = head1; if(NULL!=head2) dummy-》mNext = head2; return dummyNode.mNext;}

void BucketSort(int n,int arr[]){ vector《ListNode*》 buckets(BUCKET_NUM,(ListNode*)(0)); for(int i=0;i《n;++i){ int index = arr[i]/BUCKET_NUM; ListNode *head = buckets.at(index); buckets.at(index) = insert(head,arr[i]); } ListNode *head = buckets.at(0); for(int i=1;i《BUCKET_NUM;++i){ head = Merge(head,buckets.at(i)); } for(int i=0;i《n;++i){ arr[i] = head-》mData; head = head-》mNext; }}

基數(shù)排序

基數(shù)排序:一種多關(guān)鍵字的排序算法,可用桶排序?qū)崿F(xiàn)。

int maxbit(int data[], int n) //輔助函數(shù),求數(shù)據(jù)的最大位數(shù){ int maxData = data[0]; ///《 最大數(shù) /// 先求出最大數(shù),再求其位數(shù),這樣有原先依次每個(gè)數(shù)判斷其位數(shù),稍微優(yōu)化點(diǎn)。 for (int i = 1; i 《 n; ++i) { if (maxData 《 data[i]) maxData = data[i];

} int d = 1;

int p = 10; while (maxData 》= p) { //p *= 10; // Maybe overflow maxData /= 10; ++d; } return d;/* int d = 1; //保存最大的位數(shù) int p = 10; for(int i = 0; i 《 n; ++i) { while(data[i] 》= p) { p *= 10; ++d;

} } return d;*/}void radixsort(int data[], int n) //基數(shù)排序{ int d = maxbit(data, n);

int *tmp = new int[n]; int *count = new int[10];

//計(jì)數(shù)器 int i, j, k; int radix = 1; for(i = 1; i 《= d; i++) //進(jìn)行d次排序 { for(j = 0; j 《 10; j++) count[j] = 0; //每次分配前清空計(jì)數(shù)器 for(j = 0; j 《 n; j++) { k = (data[j] / radix) % 10; //統(tǒng)計(jì)每個(gè)桶中的記錄數(shù) count[k]++; } for(j = 1; j 《 10; j++) count[j] = count[j - 1] + count[j];

//將tmp中的位置依次分配給每個(gè)桶 for(j = n - 1; j 》= 0; j--) //將所有桶中記錄依次收集到tmp中 { k = (data[j] / radix) % 10; tmp[count[k] - 1] = data[j];

count[k]--; } for(j = 0; j 《 n; j++) //將臨時(shí)數(shù)組的內(nèi)容復(fù)制到data中 data[j] = tmp[j]; radix = radix * 10;

} delete []tmp; delete []count;}

今天的分享就到這里了,大家要好好學(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)投訴
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3716

    瀏覽量

    97185
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2124

    瀏覽量

    77112

原文標(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年度十大信創(chuàng)測(cè)評(píng)機(jī)構(gòu)”榜單桂冠
    的頭像 發(fā)表于 01-15 16:38 ?272次閱讀

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

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

    十大常見(jiàn)的芯片燒錄錯(cuò)誤,第5個(gè)幾乎人人都遇到過(guò)

    本文聚焦芯片燒錄環(huán)節(jié),盤(pán)點(diǎn)了十大常見(jiàn)且易被忽視的錯(cuò)誤,包括輕視編程器選擇、盲目使用新算法、忽視電源接地質(zhì)量、芯片接觸不良、跳過(guò)空白檢查與校驗(yàn)、忽略環(huán)境溫度影響等。強(qiáng)調(diào)可靠燒錄并非孤立動(dòng)作,而是涵蓋物料、設(shè)備、流程、環(huán)境的質(zhì)量控制系統(tǒng),核心在于對(duì)細(xì)節(jié)的執(zhí)著和規(guī)范的敬畏,為工
    的頭像 發(fā)表于 12-25 14:49 ?455次閱讀
    <b class='flag-5'>十大</b>常見(jiàn)的芯片燒錄錯(cuò)誤,第5<b class='flag-5'>個(gè)</b>幾乎人人都遇到過(guò)

    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

    CC++之間的聯(lián)系

    1、語(yǔ)法兼容性: C++完全兼容C語(yǔ)言的語(yǔ)法,這意味著任何有效的C語(yǔ)言程序都可以直接在C++
    發(fā)表于 12-11 06:51

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

    C++的標(biāo)準(zhǔn)庫(kù)那樣集成度高和功能齊全。 6、編譯器與語(yǔ)言特性: C++編譯器通常比C語(yǔ)言編譯器更加復(fù)雜,因?yàn)樗枰幚砀嗟恼Z(yǔ)言特性,比如模板元編程、命名空間、引用等。 C++
    發(fā)表于 12-11 06:23

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

    語(yǔ)法 C++異常處理涉及到3個(gè)關(guān)鍵字: throw---拋出一個(gè)異常,帶參數(shù) try---用于標(biāo)識(shí)可能會(huì)出現(xiàn)異常的代碼段 catch--是用于標(biāo)識(shí)異常處理的代碼段 下面以一
    發(fā)表于 12-02 07:12

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

    # C語(yǔ)言常見(jiàn)算法 C語(yǔ)言中常用的算法可以分為以下幾大類(lèi): ## 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 ?939次閱讀
    國(guó)產(chǎn)海光 OPS 電腦<b class='flag-5'>十大排</b>名

    科技動(dòng)態(tài)|解鎖2025全球十大工程成就

    。——愛(ài)因斯坦2025年10月13日發(fā)布了“2025全球十大工程成就”,從浩瀚宇宙到能源革命,從基礎(chǔ)科學(xué)到日常生活,勾勒出人類(lèi)工程科技創(chuàng)新的壯闊圖景。在這全球十大工程
    的頭像 發(fā)表于 10-24 18:37 ?1058次閱讀
    科技動(dòng)態(tài)|解鎖2025全球<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 ?1683次閱讀
    OPS 電腦廠家<b class='flag-5'>十大排</b>名榜:2025年最新榜單

    工業(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 ?2614次閱讀

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

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

    rtsmart開(kāi)啟C++特性支持,工具鏈編譯內(nèi)核不通過(guò)怎么解決?

    各位大佬好,本人在rtsmart項(xiàng)目中需要使用C++11特性,在menuconfig那里配置了支持C++特性,使用7.3.0版本的arm-linux-musleabi編譯器編譯內(nèi)核時(shí)出現(xiàn) 錯(cuò)誤
    發(fā)表于 03-10 08:06