最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單掌握桶排序算法及C++版的代碼實現(xiàn)

 更新時間:2016年07月06日 16:49:12   作者:skywangkw  
桶排序是將要排序的算法按桶分組排序之后再遍歷匯總的一種線性排序算法,下面就讓我們來通過小例子簡單掌握桶排序算法及C++版的代碼實現(xiàn)^^

桶排序介紹
桶排序(Bucket Sort)的原理很簡單,它是將數組分到有限數量的桶子里。
假設待排序的數組a中共有N個整數,并且已知數組a中數據的范圍[0, MAX)。在桶排序時,創(chuàng)建容量為MAX的桶數組r,并將桶數組元素都初始化為0;將容量為MAX的桶數組中的每一個單元都看作一個"桶"。
在排序時,逐個遍歷數組a,將數組a的值,作為"桶數組r"的下標。當a中數據被讀取時,就將桶的值加1。例如,讀取到數組a[3]=5,則將r[5]的值+1。

C++實現(xiàn)算法
假設數據分布在[0,100)之間,每個桶內部用鏈表表示,在數據入桶的同時插入排序。然后把各個桶中的數據合并。

#include<iterator>
#include<iostream>
#include<vector>
using namespace std;
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;
 }
}

相關文章

  • 深入全排列算法及其實現(xiàn)方法

    深入全排列算法及其實現(xiàn)方法

    本篇文章是對全排列算法及其實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言深入分析整形數據存儲

    C語言深入分析整形數據存儲

    C語言中,我們經常使用數據類型,那么整形數據在內存中如何存儲?存儲方式是什么?如果你對這些內容不太了解的話,相信看完這篇博客后,你會對整形數據的存儲有一個新的認識。話不多說,我們進入正題
    2022-08-08
  • C語言編程實例之輸出指定圖形問題

    C語言編程實例之輸出指定圖形問題

    這篇文章主要介紹了C語言編程實例之輸出指定圖形問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 如何基于 Blueprint 在游戲中創(chuàng)建實時音視頻功能

    如何基于 Blueprint 在游戲中創(chuàng)建實時音視頻功能

    我們在本文先來講講如何在 Unreal 中用 Blueprint 快速實現(xiàn)。稍后會分享基于 C++的實現(xiàn)步驟。感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • 詳解C語言中的自定義類型

    詳解C語言中的自定義類型

    這篇文章主要為大家詳細介紹了C語言中的四大自定義類型(結構體、位段、枚舉和聯(lián)合)的相關知識,文中的示例代碼簡潔易懂,需要的可以參考一下
    2023-07-07
  • 淺析C語言位域和位段

    淺析C語言位域和位段

    以下是對C語言中的位域和位段進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C++中關于std::queue?中遇到釋放內存錯誤的問題

    C++中關于std::queue?中遇到釋放內存錯誤的問題

    這篇文章主要介紹了std::queue中遇到釋放內存錯誤的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • C++元編程語言初步入門詳解

    C++元編程語言初步入門詳解

    這篇文章主要為大家介紹了C++元編程語言初步入門的詳解示例,文中包含詳細的基本概念及運用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • C語言循環(huán)鏈表實現(xiàn)貪吃蛇游戲

    C語言循環(huán)鏈表實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C語言循環(huán)鏈表實現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 簡介C++編程中的運算符重載

    簡介C++編程中的運算符重載

    這篇文章簡單介紹了C++編程中的運算符重載,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09

最新評論

远安县| 乌鲁木齐县| 廉江市| 银川市| 团风县| 丹江口市| 绥德县| 新乡县| 武汉市| 陵川县| 奉贤区| 永靖县| 施甸县| 东宁县| 蓝山县| 东乡| 韶山市| 二连浩特市| 和田县| 东安县| 丹寨县| 双城市| 哈巴河县| 台东县| 晋城| 来宾市| 金阳县| 会理县| 石棉县| 五华县| 南靖县| 建德市| 阿荣旗| 二连浩特市| 乌海市| 延寿县| 隆昌县| 揭西县| 三亚市| 南汇区| 泰州市|