简单一道排序题,考倒多少读书人

 

从华为一道面试题来看看吧,原题大意是这样的:
 

 

  有N个大小不等的自然数(1--N),请将它们由小到大排序。
    要求程序算法:时间复杂度为O(n),空间复杂度为O(1)。
      (请你做做看,时间20分钟)

 

 有人这样做:

void  sort( int  e[],  int  n)
{
 
int  i;
 
int  t;  /* 临时变量:空间复杂度O(1) */

 
for  (i = 1 ; i < n + 1 ; i ++ /* 时间复杂度O(n) */
 {
  t 
=  e[e[i]];  /* 下标为e[i]的元素,排序后其值就是e[i] */
  e[e[i]] 
=  e[i];
  e[i] 
=  t;
 }
}

void  main()

 
#define  MAX 10
 
int  i, a[MAX + 1 ]; 
 
 printf(
" Input the number from 1 to %d:/n " ,MAX);
 
for  (i = 1 ; i < MAX + 1 ; i ++ )
 {
  scanf(
" %d " , & a[i]);
 }
  
 sort(a,MAX);

 printf(
" /n====sort over====/n " );
 
for  (i = 1 ; i < MAX + 1 ; i ++ )
 {
  printf(
" %d  " ,a[i]);
 }

 printf(
" /n " );
 system(
" pause " );
}

 

上述答案其实是不对的,请看下面:

void  sort( int  e[],  int  n)
{
int  i;
int  t;  /* 临时变量:空间复杂度O(1) */

for  (i = 1 ; i < n + 1 ; i ++ /* 时间复杂度O(n) */
{
while (e != i)
{
   t 
=  e[e];  /* 下标为e的元素,排序后其值就是e */
   e[e] 
=  e;
   e 
=  t;
}
}

 这个while 实在是太强大了,心血沸腾,于是赶紧记录之。

转载于:https://www.cnblogs.com/liulei/archive/2011/09/20/2182681.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值