色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

C++基礎語法十大排序算法后五個分享

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:C語言編程學習基地 ? 2021-10-08 15:06 ? 次閱讀

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

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

歸并排序

歸并排序:把數據分為兩段,從兩段中逐個選最小的元素移入新數據段的末尾。可從上到下或從下到上進行。

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

///整數或浮點數皆可使用,若要使用物件(class)時必須設定“小於”(《)的運算子功能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];}//整數或浮點數皆可使用,若要使用物件(class)時必須設定“小於”(《)的運算子功能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;}

希爾排序

希爾排序:每一輪按照事先決定的間隔進行插入排序,間隔會依次縮小,最后一次一定要是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; }}

計數排序

計數排序:統計小于等于該元素值的元素的個數i,于是該元素就放在目標數組的索引i位(i≥0)。

計數排序基于一個假設,待排序數列的所有數均為整數,且出現在(0,k)的區間之內。

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

計數排序不是比較排序,排序的速度快于任何比較排序算法。

時間復雜度為 O(n+k),空間復雜度為 O(n+k)

算法的步驟如下:

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

2. 統計數組中每個值為 i 的元素出現的次數,存入數組 C 的第 i 項

3. 對所有的計數累加(從 C 中的第一個元素開始,每一項和前一項相加)

4. 反向填充目標數組:將每個元素 i 放在新數組的第 C[i] 項,每放一個元素就將 C[i] 減去 1

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

using namespace std;

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

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

// 統計每個鍵值出現的次數 for (int i = 0; i 《 vecRaw.size(); i++) vecCount[vecRaw[i]]++; // 后面的鍵值出現的位置為前面所有鍵值出現的次數之和 for (int i = 1; i 《 vecCountLength; i++) vecCount[i] += vecCount[i - 1];

// 將鍵值放到目標位置 for (int i = vecRaw.size(); i 》 0; i--) // 此處逆序是為了保持相同鍵值的穩定性 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號桶,最后依次把桶里的元素倒出來。

桶排序序思路:

1. 設置一個定量的數組當作空桶子。

2. 尋訪序列,并且把項目一個一個放到對應的桶子去。

3. 對每個不是空的桶子進行排序。

4. 從不是空的桶子里把項目再放回原來的序列中。

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

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

基數排序

基數排序:一種多關鍵字的排序算法,可用桶排序實現。

int maxbit(int data[], int n) //輔助函數,求數據的最大位數{ int maxData = data[0]; ///《 最大數 /// 先求出最大數,再求其位數,這樣有原先依次每個數判斷其位數,稍微優化點。 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; //保存最大的位數 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) //基數排序{ int d = maxbit(data, n);

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

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

//將tmp中的位置依次分配給每個桶 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++) //將臨時數組的內容復制到data中 data[j] = tmp[j]; radix = radix * 10;

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

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

責任編輯:haq

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

    關注

    88

    文章

    3614

    瀏覽量

    93686
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73623

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

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

收藏 人收藏

    評論

    相關推薦

    同樣是函數,在CC++中有什么區別

    同樣是函數,在 CC++ 中有什么區別? 第一返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++
    的頭像 發表于 11-29 10:25 ?272次閱讀

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

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

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

    , O(n2) 的排序算法可能會比 O(nlogn) 的排序算法執行效率高。不過隨著數據規模增大, O(nlogn) 的排序
    的頭像 發表于 10-19 16:31 ?1139次閱讀
    時間復雜度為 O(n^2) 的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>

    c++編譯鏈接失敗的原因?如何解決?

    /c++項目,將剛才新建的項目轉換為c++項目。 完成后點擊編譯,此時也是正常的。 新建一cpp文件,將原項目的main.c中內容全部拷貝到新建的cpp文件中保存,然后刪除原main
    發表于 07-25 08:13

    C++中實現類似instanceof的方法

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

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

    今天以直接插入排序算法,給大家分享一下排序算法的實現思路,主要包含以下部分內容:插入排序介紹插入排序
    的頭像 發表于 06-04 08:03 ?681次閱讀
    手把手教你<b class='flag-5'>排序</b><b class='flag-5'>算法</b>怎么寫

    鴻蒙OS開發實例:【Native C++

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

    用FPGA實現雙調排序的方法(2)

    典型的排序算法包括冒泡排序、選擇排序、插入排序、歸并排序、快速
    的頭像 發表于 03-21 10:28 ?633次閱讀
    用FPGA實現雙調<b class='flag-5'>排序</b>的方法(2)

    FPGA實現雙調排序算法的探索與實踐

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

    C語言實現經典排序算法概覽

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

    計算機視覺的十大算法

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

    c語言,c++,java,python區別

    操作系統、嵌入式系統等對性能要求較高的場景。C語言的語法相對簡單,學習曲線較平緩,也是學習其他高級語言的入門語言。 C++C++是在C
    的頭像 發表于 02-05 14:11 ?2366次閱讀

    vb語言和c++語言的區別

    Microsoft開發的一種面向對象的事件驅動編程語言。它的設計目標是簡化編程過程,讓初學者也能快速上手。與之相比,C++語言是一種通用的、面向對象的編程語言,其設計目標是提供高性能的系統級編程。 語法: VB語言的語法較為簡單
    的頭像 發表于 02-01 10:20 ?2258次閱讀

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

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

    2023年度十大科技名詞

    12月26日,“2023年度十大科技名詞”在京發布。“大語言模型、生成式人工智能、量子計算、腦機接口、數據要素、智慧城市、碳足跡、柔性制造、再生稻、可控核聚變”入選。十個最具影響力和代表性的科技名詞
    的頭像 發表于 01-03 08:27 ?613次閱讀
    2023年度<b class='flag-5'>十大</b>科技名詞
    主站蜘蛛池模板: 欧美特级午夜一区二区三区| 国产中的精品AV一区二区| WWW国产亚洲精品久久| caoporn 在线视频| 丰满的女朋友韩国版在线观看| 东北真实仑乱| 国内精品乱码卡一卡2卡三卡新区| 含羞草完整视频在线播放免费| 久久大胆视频| 欧美精品成人a多人在线观看| 日本午夜精品理论片A级APP发布| 思思久99久女女精品| 亚洲男人天堂网| 中文无码第3页不卡av| JIZJIZJIZ 日本老师水多| 国产成久久免费精品AV片天堂| 国产亚洲精品香蕉视频播放| 久久精品视频在线看| 欧美高清vivoesosexo10| 丝瓜视频在线免费| 一区二区三区国产| chinese野外男女free| 国产精品单位女同事在线| 精品香蕉99久久久久网站| 男男h开荤粗肉h文1v1| 天天插天天舔| 在线综合 亚洲 欧美| 超碰国产亚洲人人| 精品国产中文字幕在线视频| 欧美成人中文字幕在线看| 午夜伦理:伦理片| 91久久夜色精品| 国产免费麻传媒精品国产AV| 浪潮AV色综合久久天堂| 三级黄色在线观看| 浴室里强摁做开腿呻吟的漫画| 百性阁综合社区| 久久精品国产在热亚洲完整版| 人妻激情综合久久久久蜜桃| 野花社区视频WWW高清| 成人亚洲乱码在线|