转自:http://marinemath.wordpress.com/tag/algorithms/
昨天逛csdn看到一道很有意思的问题:
有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值M,要求线性空间和线性时间
既然是要求线性时间,普通的排序方式就不能采用了,而时间复杂度为O(n)的排序方法就无非基数排序和桶排序。于是就有了对应的解法。
1. 桶排序: 最关键的建桶,如果桶设计得不好的话桶排序是几乎没有作用的。通常情况下,上下界有两种取法,第一种是取一个10^n或者是2^n的数,方便实现。另一种是取数列的最大值和最小值然后均分作桶。
对于这个题,最关键的一步是:由抽屉原理知:M>= (Max(V[n])-Min(V[n]))/(n-1)! 所以,假如以(Max(V[n])-Min(V[n]))/(n-1)为桶宽的话,答案一定不是属于同一个桶的两元素之差。因此,这样建桶,每次只保留桶里面的最大值和最小值即可。
2.基数排序: 我还没想好(= =),但是实数列要用基数排序还是很困难的。
#include
#include
using namespace std;
const double C=10e10;
int main()
{
int s[100],Max_s[100],Min_s[100];
int n;
dounle Max=-C,Min=C;
cin>>n;
for (int i=0;i!=n;++i)
{
cin>>s[i];
Max=max(Max,s[i]);
Min=min(Min,s[i]);
Max_s[i]=-C;
Min_s[i]=C;
double length=(Max-Min)/(n-1);
for(int i=0;i!=n;++i)
{
Max_s[(int)((s[i]-Min)/length)]=max(s[i],Max_s[(int)((s[i]-Min)/length)]);
Min_s[(int)((s[i]-Min)/length)]=min(s[i],Min_s[(int)((s[i]-Min)/length)]);
}
//Deal with max difference