算法-排序-桶排序

桶排序

桶排序期望的运行时间是Θ(n)
局限:输入数组要在[0,1)之间(下面有更通用的版本3⃣️)
1⃣️内置排序没有用插入排序而是c++自带的sort,要用插入排序可保证算法稳定性。

void bucket_sort(float *array,int length){vector<vector<float>> bucket(length);for (int i = 0; i < length; ++i) {bucket[(int)(length*array[i])].push_back(array[i]);}for (int i = 0; i < length; ++i) {sort(bucket[i].begin(),bucket[i].end());}int index = 0;for (int i = 0; i < length; ++i) {while (bucket[i].size()>0){array[index] = bucket[i][bucket[i].size()-1];bucket[i].pop_back();index++;}}
}

2⃣️对半径为1的圆周内不包含边界的点,对离圆心的距离进行排序

void bucket_sort(vector<Vector2>& array)
{vector<vector<Vector2>> buckets(array.size());for (int i = 0; i < array.size(); ++i) {buckets[(int)(array[i].module()*array.size())].push_back(array[i]);}for (int i = 0; i < array.size(); ++i) {sort(buckets[i].begin(),buckets[i].end(), compare);}int index = 0;for (int i = 0; i < array.size(); ++i) {while (buckets[i].size()>0){array[index] = buckets[i][buckets[i].size()-1];buckets[i].pop_back();index++;}}
}

辅助Vector2类

class Vector2 {
public:float x;float y;
public:Vector2(float x = 0.0,float y = 0.0);float module() const;
};
static bool compare(const Vector2 &item1,const Vector2 &item2)
{return item1.module() <= item2.module();
}
#include "Vector2.h"
Vector2::Vector2(float x,float y):x(x),y(y){}
float Vector2::module() const{return sqrt(x*x+y*y);
}

3⃣️对变长整数的排序
算法导论第三版8-3a题,变长数据项的排序

void bucket_sort_variable_length(int *array,int length)
{vector<vector<int>> positive_bucket(length);vector<vector<int>> negative_bucket(length);for (int i = 0; i < length; ++i) {int len = get_int_length(array[i]);if(array[i]<0){negative_bucket[len-1].push_back(array[i]);}else{positive_bucket[len-1].push_back(array[i]);}}for (int i = 0; i < length -1; ++i) {if(negative_bucket[i].size()>0){radix_sort(negative_bucket[i],i+1);}if(positive_bucket[i].size()>0){radix_sort(positive_bucket[i],i+1);}}int index = 0;for (int i = length -1; i >= 0; --i) {if(negative_bucket[i].size()>0){copy(negative_bucket[i].begin(),negative_bucket[i].end(),array+index);index += negative_bucket[i].size();}}for (int i = 0; i < length -1; ++i) {if(positive_bucket[i].size()>0){copy(positive_bucket[i].begin(),positive_bucket[i].end(),array+index);index += positive_bucket[i].size();}}
}

辅助函数 get_int_length

int get_int_length(int value)
{int length = 0;while (value != 0){value /=10;length++;}return  length == 0 ? 1 : length;
}

辅助排序地址
1⃣️基数排序
2⃣️计数排序

4⃣️对变长字符串数组的的排序
算法导论第三版8-3b题,变长数据项的排序

void bucket_sort(vector<string>& array){vector<vector<string>> bucket(26);for (int i = 0; i < array.size(); ++i) {bucket[tolower(array[i][0])-'a'].push_back(array[i]);}sort(bucket.begin(),bucket.end());int index = 0;for (int i = 0; i < 26; ++i) {while (bucket[i].size()>0){array[index] = bucket[i][0];bucket[i].erase(bucket[i].begin());index++;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LED计数电路,5输入按键编码器,7段数码管显示驱动集成为LED计数测试电路

LED计数电路: 5输入按键编码器: 7段数码管显示驱动真值表: 集成:

越卖越涨?腾讯股票3月后大涨45%,超越“阿里”成中国第一,市值相当于14.3个百度!...

01 腾讯股价大涨据股市最新消息&#xff1a;腾讯股价已连续3个交易日上涨, 其中6月22日腾讯股价重返470港元关口&#xff0c;公司市值突破4.5万亿港元&#xff0c;折合4.0万亿人民币&#xff1b;而6月23日上午腾讯股价再度大涨4.05%&#xff0c;刷出493.8港元的新高&#xf…

4位无符号比较器设计

4位比较器原理&#xff1a; 4位比较 a3a2a1a0 : b3b2b1b0&#xff0c;比较顺序从高位到低位&#xff0c;当高位大、小关系确定时则无需看低位&#xff0c;当高位相等时再看相邻低位的关系。 注意&#xff1a;对于三个比较结果&#xff0c;已知其中任意两个&#xff0c;可以用…

算法导论水壶问题(第三版第八章思考题8-4)

算法导论水壶问题 &#xff08;第三版第八章思考题8-4&#xff09; 本算法只适用于解题&#xff0c;不通用。 期望的时间复杂度O&#xff08;nlgn&#xff09; Kettle.h文件 #ifndef C11LEARN_KETTLE_H #define C11LEARN_KETTLE_H#include <iostream> #include <vec…

关于技术文章“标题党”一事我想说两句

阅读本文大概需要 1.8 分钟。前天发表的一篇文章&#xff0c;标题是&#xff1a;“面试官&#xff1a;你刚说你喜欢研究新技术&#xff0c;那么请说说你对 Blazor 的了解”。确实&#xff0c;这篇文章有标题党的味道&#xff0c;如果因此给部分童鞋带来不适&#xff0c;我在这先…

算法-排序-k排序(算法导论第三版第八章思考题8-5)

算法-排序-k排序 算法导论第三版第八章思考题8-5 时间复杂度Θ(nlg(n/k))。 利用最小堆完成&#xff0c;把元素分成k个堆&#xff0c;每个堆大小⌈n/k⌉。 利用堆作为子排序稳定&#xff0c;也可以采用其他排序作为子排序&#xff0c;子排序的算法时间复杂度保证在Θ(klgk)就行…

使用 nuget server 的 API 来实现搜索安装 nuget 包

使用 nuget server 的 API 来实现搜索安装 nuget 包Intronuget 现在几乎是 dotnet 开发不可缺少的一部分了&#xff0c;还没有用过 nuget 的就有点落后时代了&#xff0c;还不快用起来nuget 是 dotnet 里的包管理机制&#xff0c;类似于前端的 npm &#xff0c;php 的 composer…

找出第二小元素(算法导论第三版9.1-1题)

找出第二小元素&#xff08;算法导论第三版9.1-1题&#xff09; 时间复杂度Θ(n) 比较次数n⌈lgn⌉−2次 思路&#xff1a;将元素每次分成2部分&#xff0c;第一部分和第二部分元素成对比较。最终获得最小的元素&#xff0c;记录那些和最小元素比较后的失败的元素&#xff0c;…

Kubernetes:通过自动化节省IT预算的4种方法

导语大多数CIO和IT领导者都熟悉反复执行的任务“事半功倍”。在许多组织中&#xff0c;这都是现实&#xff0c;在各种其他因素&#xff08;例如宏观经济状况&#xff09;的影响下&#xff0c;这种趋势往往会起伏不定。正文有时&#xff0c;“用更少的钱做更多的事”可能会更准确…

找出最大值和最小值(算法导论第三版9.1-2)

找出最大值和最小值 &#xff08;算法导论第三版9.1-2) 在最坏的情况下&#xff0c;比较次数下界是⌈3n/2⌉−2 void find_maximum_and_minimum_element(int *array,int length,int &max,int &min){int remainder length % 2;int start_index 0;if(remainder){//奇…

《Unit Testing》1.4. 成功的测试套件拥有哪些属性?

什么造就了成功的测试套件如果测量测试套件的质量&#xff1f;唯一可行的办法就是对测试套件里每一个测试进行单独的评估。你不需要一次性把它们都评估完。你可以逐步的进行评估成功的测试套件拥有以下属性&#xff1a;集成到开发周期中只针对代码库中最重要的部分它以最低的成…

找出数组中第i小元素(时间复杂度Θ(n)--最坏情况为线性的选择算法

找出数组中第i小元素 期望时间复杂度&#xff1a;Θ(n) 最坏情况的时间复杂度Θ(n^2) int randomized_select(int *array,int start,int end,int index){if(start end)return array[start];int middle randomized_partition(array,start,end);int position middle - start…

C# 9.0 终于来了, Top-level programs 和 Partial Methods 两大新特性探究

一&#xff1a;背景1. 讲故事.NET 5 终于在 6月25日 发布了第六个预览版&#xff0c;随之而来的是更多的新特性加入到了 C# 9 Preview 中&#xff0c;这个系列也可以继续往下写了&#xff0c;废话不多说&#xff0c;今天来看一下 Top-level programs 和 Extending Partial Meth…

4位BCD计数器设计

状态转换: 输出函数: 4位BCD计数器设计:

[Mvp.Blazor] 集成Ids4,实现统一授权认证

&#xff08;又一个客户端集成了IdentityServer4&#xff09;还是很开心的&#xff0c;目前已经有六个开源项目都集成到了Ids4认证中心了。1、Blazor系列文章回顾书接上文&#xff0c;关于Blazor学习呢&#xff0c;我也发了几篇文章了&#xff0c;我一般写东西都喜欢偏实战&…