受桶排序思想的启发,想到了这个算法。不同之处在于,桶排序是对于每个bucket各自排序,而本算法桶内部不需要排序。

功能

本算法可以在有限空间内,将任意有理数排序,平均时间复杂度为O(n)

输入:需要排序的数(正有理数 / 负有理数 / 0)
输出:本算法排序结果 + 用于比对的标准答案

思路

利用桶排序的思想,不同之处在于(在不浪费的基础上)建立足够多的桶(同时保证桶的数量为有限个),每个只存存放相同数值的元素

1、找到精度最高的数,(精度最高的数,也就是小数点后面位数最多,记其小数点后位数为len
2、找到待排序元素的最大值max,最小值min
3、建立桶,建立哈希函数,将数据放入桶中
4、遍历桶,逆推函数,输出

例如,要排序的数字为:-4 2.1 2 1 5,则桶的个数为(max-min)*10^len+1=91个,这样能保证所有值不同的元素都有且只有一个桶可放。值相同的元素放在相同的桶中。映射关系如下:

运行结果示例

请输入你要排序的数字个数:20
5
-6.2
-6.3
2.22
2.23
1
8.2
10
10
8.3
8.4
10
2.2
3.5
2.2
7
0
5.1
7
4.2
小数点后最多 2 位
最小:-6.3
最大:10
桶的个数:1631排序后:
元素    重复次数
-6.3    1
-6.2    1
0       1
1       1
2.2     2
2.22    1
2.23    1
3.5     1
4.2     1
5       1
5.1     1
7       2
8.2     1
8.3     1
8.4     1
10      3正确答案
-6.3
-6.2
0
1
2.2
2.2
2.22
2.23
3.5
4.2
5
5.1
7
7
8.2
8.3
8.4
10
10
10

代码

第45、46行使用了字符串处理有关的函数,如果说整个算法不是严格意义上的O(n)的话,大概是因为这两行吧…

#include<iostream>
#include<string>
#include<vector>
#include<time.h>
#include<algorithm>
#include<math.h> #define SWAP(a,b) {Node t;t=a;a=b;b=t;}using namespace std;class Node//被排序的元素
{public:double val;int afterPoint;
};int mysort(Node a1, Node a2)//此函数未在算法中调用 仅用于检测结果正确性
{return a1.val < a2.val;
}int main()
{//总元素个数srand((int)time(NULL));int total;cout << "请输入你要排序的数字个数:";cin >> total;/*--------------------------------------以下为O(n)排序算法--------------------------------------*///读取每一个元素 并记录最大的小数点后数字位数 如:2.555的afterPoint=3 1.2的afterPoint=1string str;vector <Node> arr;Node oneNode;int afterPointMax = 0;int i;cout << "请输入你要排序的数字:\n";for (i = 0; i < total; i++){cin >> str;oneNode.val = atof(str.c_str());//string to doubleint pointPlace = str.find_first_of(".");//小数点位置oneNode.afterPoint = (pointPlace == -1 ? 0 : str.length() - pointPlace - 1);//计算小数点后面的位数 afterPointMax = (afterPointMax > oneNode.afterPoint ? afterPointMax : oneNode.afterPoint);//记录最大的小数位数arr.push_back(oneNode);}cout << "小数点后最多 " << afterPointMax << " 位" << endl;//同时找最大最小//偶数个 分两半 一半含有最大 一半含有最小 O(n/2)double max, min;for (i = 0; i < total / 2; i++){if (arr[i].val > arr[total / 2 + i].val){SWAP(arr[i], arr[total / 2 + i]);//小的放左边}}//找最小 O(n/2)min = arr[0].val;for (i = 0; i < total / 2; i++){if (arr[i].val < min){min = arr[i].val;}}//找最大 O(n/2)max = arr[total / 2].val;for (i = total / 2; i < total; i++){if (arr[i].val > max){max = arr[i].val;}}//如果最后元素轮空 再加一次比较if (total % 2 != 0){if (arr[total - 1].val < min)min = arr[total - 1].val;if (arr[total - 1].val > max)max = arr[total - 1].val;}//输出cout << "最小:" << min << endl;cout << "最大:" << max << endl;//桶的个数double bucketNum;bucketNum = (max - min)*pow(10, afterPointMax) + 1;cout << "桶的个数:" << bucketNum << endl;//定义桶并初始化为0int* bucket = new int[(int)bucketNum];for (i = 0; i < bucketNum; i++){bucket[i] = 0;}//类似构建一个哈希函数int t;for (i = 0; i < total; i++){t = pow(10, afterPointMax);bucket[(int)((arr[i].val - min) / (max - min)*(bucketNum - 1) + 0.5)]++;//0.5用于强制四舍五入}//函数逆推并输出排序结果cout << "\n排序后:\n元素\t重复次数\n";for (i = 0; i < bucketNum; i++){if (bucket[i] != 0){cout << (i / (bucketNum - 1)*(max - min)) + min << "\t";cout << bucket[i] << endl;}}/*--------------------------------------以上为O(n)排序算法--------------------------------------*///正确性检测:以下输出正确答案作为对比cout << "\n正确答案\n";sort(arr.begin(), arr.end(), mysort);for (i = 0; i < total; i++){cout << arr[i].val << endl;}cout << endl;system("pause");
}

算法设计与分析 自创O(n)排序算法 适用于任何有理数相关推荐

  1. 0x08算法设计与分析复习(二):算法设计策略-回溯法2

    参考书籍:算法设计与分析--C++语言描述(第二版) 算法设计策略-回溯法 子集和数 问题描述 已知n个不同的正数wi(0≤i≤n−1)的集合,求该集合的所有满足条件的子集,使得每个子集中的正数之和等 ...

  2. 计算机算法设计与分析第四版复习,计算机算法设计与分析(第4版)第1章.ppt

    <计算机算法设计与分析(第4版)第1章.ppt>由会员分享,可在线阅读,更多相关<计算机算法设计与分析(第4版)第1章.ppt(50页珍藏版)>请在人人文库网上搜索. 1.计算 ...

  3. 算法设计与分析(第四周)贪心算法、背包问题

    贪心算法 顾名思义,贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的. 虽然贪心算 ...

  4. 计算机算法设计与分析教学大纲,《算法设计与分析》教学大纲

    <<算法设计与分析>教学大纲>由会员分享,可在线阅读,更多相关<<算法设计与分析>教学大纲(3页珍藏版)>请在人人文库网上搜索. 1.课程编号:&quo ...

  5. 算法设计与分析复习--回溯法

    算法设计与分析期末复习 主要参考: ​ 算法设计与分析(北京航空航天大学MOOC) ​ 算法设计与分析(北京大学MOOC) ​ 华中科技大学 计算机科学与技术学院 算法设计与分析 课堂教学PPT 五. ...

  6. 程振波 算法设计与分析_算法设计与分析

    本书按照教育部*制定的计算机科学与技术专业规范的教学大纲编写,努力与国际计算机学科的教学要求接轨.强调 算法 与 数据结构 之间密不可分的联系,因而强调融数据类型与定义在该类型上的运算于一体的抽象数据 ...

  7. 算法设计与分析(第4版)

    算法设计与分析(第4版) 算法引论 算法与程序 算法:解决问题的方法或过程 输入 输出 确定性 有限性 程序:算法用某种程序设计语言的具体实现 表达算法的抽象机制 高级程序设计语言 抽象数据类型 描述 ...

  8. 《大数据算法》一1.3 大数据算法设计与分析

    本节书摘来华章计算机<大数据算法>一书中的第1章 ,第1.3节,王宏志 编著, 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.3 大数据算法设计与分析 本 ...

  9. 算法设计与分析课程的时间空间复杂度

    算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...

最新文章

  1. dos下命令行执行程序时候注意程序所使用文件的路径问题
  2. 实现一个队列类,该类用两个栈来实现
  3. nth-child和nth-of-type
  4. 【转载】intellij idea如何将web项目打成war包
  5. linux使用vim开启文档,linux 配置 直接用VIM默认打开文件
  6. ballerina 学习二十六 项目docker 部署 运行(二)
  7. C++ 函数需要有返回值,但非全分支return(RVO)
  8. 软件开发过程中需要的文档汇总
  9. R语言批量下载PubMed摘要
  10. matlab如何求开方,matlab中开方怎么表示
  11. /deep/ >>> ::v-deep的用法
  12. Python当前时间是一年中第几周
  13. 【链表】两个无序链表合并成递增有序链表(利用原表空间)
  14. 【扫盲贴】浅谈38K红外发射接受编码(非常好)
  15. Android 天气APP(十三)仿微信弹窗(右上角加号点击弹窗效果)、自定义背景图片、UI优化调整
  16. LaTex常用公式和字母
  17. TokenInsight对话首席——褪去浮华归本真!2020公链自主创新突破之路
  18. IOS Safari浏览器添加桌面图标
  19. Python黑马头条推荐系统第四天 TensorFlow框架介绍和深度学习
  20. 千呼万唤始出来!地平线即将发布第一代人工智能“中国芯”

热门文章

  1. HDU - 5877 Weak Pair(离散化+树状数组+dfs序)
  2. TensorFlow2-自编码器
  3. 机器学习-Stacking方法的原理及实现
  4. 省选考试防爆0注意事项(PART1考试习惯)
  5. QT乱码总结2.gbk和ANSI和gb2312的区别
  6. 绕过360安全卫士的部分代码
  7. 透过汇编另眼看世界之多继承下的虚函数函数调用
  8. 重叠I/O之事件对象通知
  9. SQL Server date、datetime、smalldate区别
  10. 用完成例程(Completion Routine)实现的重叠I/O模型