华为面试题

fidt982 2005-12-01 09:18:08
有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.

//这是昨天在华为的面试题,楞是没做出来.
...全文
3615 133 打赏 收藏 转发到动态 举报
写回复
用AI写文章
133 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovememememe 2006-02-12
  • 打赏
  • 举报
回复
mark
Fly3361bird 2005-12-19
  • 打赏
  • 举报
回复
测试了下,可以,
这个小程序高了这么长,结贴给分把
oosky2004 2005-12-19
  • 打赏
  • 举报
回复
不错。
这贴值得顶。。。

支持鼎鼎的算法,你是咋想出来的呢。
JOKER_UFO 2005-12-19
  • 打赏
  • 举报
回复
不好意思,又插嘴了.
排序算法的要点(目前最快排序算法复杂度为n*log2(n)) + 题目的条(时间复杂度为O(n))=>不可能.=> 于是想办法 =>再次利用题目特殊条件 => 方案(特殊问题特殊解决)
do i <-0 to n-1
if a[i] > i
swap(a[a[i]-1],a[i])
zzyzww 2005-12-19
  • 打赏
  • 举报
回复
计数排序,就好了!
woodysunny 2005-12-19
  • 打赏
  • 举报
回复
a = ( int* ) malloc ( ( n + 1 ) * sizeof( int ) );
这个是什么意思啊?
看不懂
ghy2001 2005-12-19
  • 打赏
  • 举报
回复
回一下,有空研究.
Fly3361bird 2005-12-18
  • 打赏
  • 举报
回复
for(i=0;i<n;i++)
{
b=a[i];
a[i]=a[b-1];
a[b-1]=b;
}
修改了下了上面的程序,
  • 打赏
  • 举报
回复
回头想来 weisunding(鼎鼎) 用了
if ( a[i] == i + 1)
i++;
还不如
a[i] = i + 1;
---------------------------------
HW到底要考什么?!
wklucky 2005-12-18
  • 打赏
  • 举报
回复
好好学习..
langzi520 2005-12-18
  • 打赏
  • 举报
回复
不晓得这个正确的算法是怎么想出来的/
laiwusheng 2005-12-18
  • 打赏
  • 举报
回复
大家要努力啊
lvfeng180 2005-12-18
  • 打赏
  • 举报
回复
ding
luyufan221 2005-12-17
  • 打赏
  • 举报
回复
那是C++语言里面的引用啊!!!
可以用C里面的指针代替!!
yuairong 2005-12-17
  • 打赏
  • 举报
回复
三楼的大哥,你的程序写得还可以,只不过里面有点看不懂的地方,如:int swap( int&, int& );和int swap( int &i, int &j )这两个地方,俺在运行是提示出错了,把这两个地方的&符号去掉以后就可以了,可不可以解释一下用‘&’的目的呀!!!
yuairong 2005-12-17
  • 打赏
  • 举报
回复
各位大师,大家都是高手,写程序要整齐美观一点我们这些菜鸟才可以顺利地看哦!!
谢谢了!!!
zhiguo_he 2005-12-17
  • 打赏
  • 举报
回复
**** Shaffle <<Data Structs And Algorithm Analysis>>的第2章有个时间空间权衡的例子就是这个问题
luyufan221 2005-12-17
  • 打赏
  • 举报
回复
我也觉的只有
weisunding(鼎鼎)是对的,
其它的算法都有问题
大家觉的呢??
  • 打赏
  • 举报
回复
//帮 weisunding(鼎鼎) 整理下,他的很经典啊,呵呵.
#include<iostream.h>

int main()
{
int a[] = {10,6,9,5,2,8,4,7,1,3};
int len = sizeof(a) / sizeof(int);
int temp;

for(int i = 0; i < len; )
{
temp = a[a[i] - 1];
a[a[i] - 1] = a[i];
a[i] = temp;

if ( a[i] == i + 1)
i++;
}
for (int j = 0; j < len; j++)
cout<<a[j]<<",";

return 0;
}
  • 打赏
  • 举报
回复
//经过测试,weisunding(鼎鼎) 的算法是对的, fabio210(狂笑江湖)的方法不对,下面这个算法也没问题
#include <stdio.h>
#include <iostream.h>

void swap(int v[], int i, int j)
{
int temp;

temp = v[i];
v[i] = v[j];
v[j] = temp;
}

void qsort(int v[], int left, int right)
{
int i, last;

if (left >= right)
return;
swap(v, left, (left+right)/2);
last = left;
for (i = left+1; i <= right; i++)
if (v[i] < v[left])
swap(v, ++last, i);
swap(v, left, last);
qsort(v, left, last-1);
qsort(v, last+1, right);
}

int main()
{
int a[] = {10, 5, 9, 7, 8, 2, 6, 3, 1, 4};
qsort(a, 0, 9);
for (int i = 0; i < 10; i++)
cout<<a[i]<<",";
cout<<endl;
}
加载更多回复(113)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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