面试中的一个排序算法问题,有兴趣的道友一起来看看,给出你的想法

SurgePing 2012-09-30 11:10:00
1.const和define定义的类型是一样的?(这样问,答案应该是错误的吧,若是#define定义的常量才算对的?

2.一组无序的数据,有n个,如a[]={4,2,4,23,53,1,1,32,8},求排序算法,要求时间效率为O(n),空间效率O(1),使用交换,而且一次只能交换两个数。(这个排序算法,当时做的时候一点头绪都没有,每次 对于这种要求时间效率和空间效率的算法,都不知道从何处入手,请大大虾们支支招吧,你们遇到这种问题,一般怎么处理?
...全文
455 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzb56 2012-10-03
  • 打赏
  • 举报
回复
zxj268514725114 2012-10-03
  • 打赏
  • 举报
回复
1.const和define定义的类型是一样的?
#define是预处理指令,本质是替换,就算是定义的一个宏常量,预处理完之后也被宏的内容给彻底替代了,压根就不会有define定义的类型这一说。
宏是简单的文本替换,在预处理阶段时完成,运行报错时直接报相应的值;跟踪调试时也是显示值,而不是宏名;宏没有类型检查,不安全;宏没有作用域。
以宏形式写的代码难以调试难以打断点,不利于定位问题。
宏如果调用的很多,会造成代码空间的浪费,不如函数空间效率高。


SKATE11 2012-10-02
  • 打赏
  • 举报
回复
就这个题目而言 感觉是用个大小为54的数组就行了 遍历数组把相应数映射到数组对应位置并计数 就像你给字母排序那样 然后遍历求出结果
kimili1987 2012-10-02
  • 打赏
  • 举报
回复
11楼说的对,算法导论中第8章已经证明,基于交换的方式,可以抽象为决策树模型,最坏情况下,都需要nlgn次比较,所以如果采用交换方式,不能达到O(n),而如果使用计数排序,并不是交换的方式。而基数排序,在每一位排序时需要稳定的排序算法,而如果使用比较的方式,也是nlgn。
独孤过儿 2012-10-02
  • 打赏
  • 举报
回复
1) define叫宏,const在C和C++中有很大区别。可以说,这两个东东完全完全不同

2) comparison sort的下界是n*lgn,利用decision tree可以证明,详见<算法导论>(第三版) Chapter 8

所以你的那个排序,只能是counting sort。楼上的已经写了,不罗嗦了

huangxy10 2012-10-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
1.const和define定义的类型是一样的?(这样问,答案应该是错误的吧,若是#define定义的常量才算对的?)

2.一组无序的数据,有n个,如a[]={4,2,4,23,53,1,1,32,8},求排序算法,要求时间效率为O(n),空间效率O(1),使用交换,而且一次只能交换两个数。(这个排序算法,当时做的时候一点头绪都没有,每次 对于这种要求时间效率和空间效率的算法,都不知道从何处……
[/Quote]
基于交换的内部排序没有能够达到线性的,计数排序应该可以满足。
绿野耕夫 2012-10-01
  • 打赏
  • 举报
回复
#define是预处理指令,本质是替换,就算是定义的一个宏常量,预处理完之后也被宏的内容给彻底替代了,压根就不会有define定义的类型这一说。
n个数据排序那个,计数排序的排序时间O(n),但是要利用至少(原始数据中最大值-原始数据中最小值)个空间,即计数排序其实都对原始数据有某些要求,假如原始数据中最大和最小值相差很大,那就很浪费空间。

感觉这两个题都出得有问题。
卖萌de猫 2012-10-01
  • 打赏
  • 举报
回复
第一题问的本身就有问题吧,#define定义的能有类型吗,#define PI 3.14159会在预编译阶段进行展开,到了编译时其实都成了常量
皮特尔 2012-10-01
  • 打赏
  • 举报
回复
4楼那个链接里的内容好像就是楼主要的答案。
SurgePing 2012-10-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

1.任何情况都不对,即便定义常量也不一样,而且不算define,但就是C和C++的const的语义也不一样

2.题目有问题吧,使用交换排序不可能做到任意情况时间复杂度O(n),只有最好情况是的,你这一题到可以这样做,用计数排序,因为如果按示例数据那样不超过255的话,计数排序只需要一个额外的255单位的数组,也算是常数空间
[/Quote]
1.我清楚#define定义了常量,他们内存空间都是不一样,还存在一些语义的不同,而我意思是,const和#define是不是根本就没有类型这一比较之说;
2.题目应该不会有问题的,大致愿意是上面描述的那样,大虾,能提供个计数排序的思路给分析下吗,谢谢啊!
luoyuxuan566 2012-09-30
  • 打赏
  • 举报
回复
这个有点类似 可以看看 http://www.dewen.org/q/6207/%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%A7%BB%E4%BD%8D%EF%BC%8C%E6%9C%89%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6%E5%92%8C%E7%A9%BA%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6%E8%A6%81%E6%B1%82#12687
jackyjkchen 2012-09-30
  • 打赏
  • 举报
回复
说错了,是256个单位的数组
jackyjkchen 2012-09-30
  • 打赏
  • 举报
回复
1.任何情况都不对,即便定义常量也不一样,而且不算define,但就是C和C++的const的语义也不一样

2.题目有问题吧,使用交换排序不可能做到任意情况时间复杂度O(n),只有最好情况是的,你这一题到可以这样做,用计数排序,因为如果按示例数据那样不超过255的话,计数排序只需要一个额外的255单位的数组,也算是常数空间
dpdp_2012 2012-09-30
  • 打赏
  • 举报
回复
时间复杂度o(n),我所知道的只有计数排序,得知道a[i]的范围,最好是整数,空间复杂度也不是o(1),等大神。
hackbuteer1 2012-09-30
  • 打赏
  • 举报
回复
这个排序题木有思路啊

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧