• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 简单掌握桶排序算法及C++版的代码实现

简单掌握桶排序算法及C++版的代码实现

作者:skywangkw 字体:[增加 减小] 来源:互联网 时间:2017-05-28

skywangkw 通过本文主要向大家介绍了c++桶排序,c++递归算法,c++算法,c++排序算法,c++数据结构与算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

桶排序介绍
桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里。
假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX)。在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0;将容量为MAX的桶数组中的每一个单元都看作一个"桶"。
在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标。当a中数据被读取时,就将桶的值加1。例如,读取到数组a[3]=5,则将r[5]的值+1。

C++实现算法
假设数据分布在[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;
 }
}
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 简单掌握桶排序算法及C++版的代码实现

相关文章

  • 2017-05-28C++实现 单例模式实例详解
  • 2017-05-28Linux下semop等待信号时出现Interrupted System Call错误(EINTR)解决方法
  • 2017-05-28C++实现 vector 的四则运算
  • 2017-05-28素数判定算法的实现
  • 2017-05-28基于C语言实现简单的12306火车售票系统
  • 2017-05-28将字符串str1复制为字符串str2的三种解决方法
  • 2017-05-28深入解析C++中的指针数组与指向指针的指针
  • 2017-05-28C++中函数模板的用法详细解析
  • 2017-05-28C语言中计算正弦的相关函数总结
  • 2017-05-28C语言运算符及其优先级汇总表口诀

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅谈C语言函数调用参数压栈的相关问题
    • C++继承中的访问控制实例分析
    • C++读取到回车换行符问题处理
    • 平衡二叉树的实现实例
    • 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
    • VS2010/MFC编程(常用控件:树形控件Tree Control控件创建h和实例)
    • 如何用C++实现双向循环链表
    • 浅谈socket TCP编程中connect的一些坑
    • C++ 处理中文符号实例详解
    • 在C语言中使用对数函数的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有