Chinaunix首页 | 论坛 | 博客
  • 博客访问: 159379
  • 博文数量: 25
  • 博客积分: 1222
  • 博客等级: 中尉
  • 技术积分: 322
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-27 10:18
文章分类
文章存档

2011年(7)

2010年(9)

2009年(9)

我的朋友

分类: C/C++

2011-05-17 22:25:41

   前天去面试某互联网公司的时候,碰到了一道排序算法题,要求时间复杂度为O(n),即使快速排序算法时间复杂度也为O(nlogn),紧张情况下也没想到好办法。只好说暂时想不到,回家在看看。
   题目大概是这样子:有N个正整数序列,数值范围在1到1000000,要求对该序列进行排序,时间复杂度为O(n)。
   回来重新看了看题目,发现“数值范围在1到1000000”这个前提条件非常重要,决定了时间复杂度是否可以为O(n)的问题。其实有个限制,我们就可以那数组来做文章了,简单就可以实现了,算法实现如下。
#define MAX_VALUE (10000000)
unsigned int base[MAX_VALUE+1]={0};
#define N (10000)
unsigned int array[N];
void integer_sort(unsigned int a[],int nLen)
{
    int i;
    int k;
    int j=0;
    for(i = 0;i < nLen;i++)
    {
        base[a[i]] += 1;  //o(n)
    }
    for(i = 1; i <= MAX_VALUE;i++)
    {
        k = base[i];
        for(;k>0;k--){
            array[j++] = i;//o(n)
        }
    }
}
阅读(1981) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~