桶排序

一看题目这么长,聪明的你肯定已经猜到了这是个标题党。

据说这个某个公司的招聘题,某个追求时间和空间极限的bt程序员某个时间脑袋灵光一闪,搞出来这些个所谓的nb算法,然后再自豪地把它们呈给那些技术面试官,让他们用这些来测测我们这些普通程序员的脑袋是否灵光。然而,网络的发达或许让他们的这一想法完全落空,本来就是些高中生都能看懂的算法(似乎我没有夸张),加上网络一传播,地球人都知道了。所以到最后,也只能考考那些从未看过类似我这篇Blog的人:)。所以,我自己倒是更愿意把这个归为一道智力测试题。

国外已经有很多专家在质疑智力测试的准确性,在知识能够迅速获取的今天,很多智力题目只要你做过一次,第二次就不再是智力测试,而是记忆力测试了。所以很奇怪为什么现在面试官对智力测试有一种不可思议地喜欢,我们姑且称之为"智力测试喜好症候群"。

好了,言归正传,看过这篇Blog的ggmm以后面试碰上这种题目就不用经过大脑了,可以脱口而出,或者脱笔而出,或者脱X而出了(Coding,那是脱什么来着?)。

//不用temp的整数交换,一点点数学上的trick:) 
void NotempSwap(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
}

关于时间复杂度为O(n)以及空间复杂度为O(1)的整数排序算法,实际上是有前提的,面试官一般会这么问:

给定1000000个数,这些数都在0~65535之间,设计一个算法,将这些数排序?

下面的这个NiuabilitySort()函数,就是号称时间时间复杂度为O(n)、空间复杂度为O(1)的算法思想的一个实现:

//给100000~...000个整数排序,这些整数的大小都位于0~MAX_NUM之间 
const int MAX_NUM = 65535;
int base_array[MAX_NUM];

//sort_array为要排序的数组,length为该数组长度
void NiuabilitySort(int* sort_array,int length)
{
for (int i = 0; i {
//先初始化基数组
base_array[i] = 0;
}

for (int i = 0; i< length; i++)
{
base_array[sort_array[i]]++;
}
//更新排序结果到sort_array中
int j = 0;
for (int i = 0; i < MAX_NUM; i++)
{
if (base_array[i] != 0)
{
for (int k = 0; k {
sort_array[j] = i;
j++;
}
}
}
}

这个算法的思想是:在数字范围有限制的情况下,用一个数组(这里是base_array)记录要排序的数组中(sort_array)每个数字出现的次数,然后再扫描一遍base_array数组,按次数去更新sort_array,而更新值就是base_array当前的下标值。

base_array这个空间是常量,所以空间复杂度是O(1)。两次遍历,对sort_array一遍扫描,时间复杂度是O(n),对base_array一遍扫描,时间复杂度是O(1),所以最后的时间复杂度是O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值