社区
C语言
帖子详情
有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数
xiao_xiao_zi
2009-09-02 03:16:41
有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数
这个的代码如何写????
...全文
1101
16
打赏
收藏
有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数
有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数 这个的代码如何写????
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yuanmeibin
2012-04-03
打赏
举报
回复
桶排序的空间复杂度是不正确的 所以桶排序也不行 我自己也在写这个程序 不过写了很多次都是有缺陷的 就像十二楼的那样 总能找到测试案例是他出错。。。
yuanmeibin
2012-04-03
打赏
举报
回复
[Quote=引用 11 楼 的回复:]
排序算法的时间复杂度一般都是n^2,因为这个数组的特殊性,可以达到O(n)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n[9]={0,1,3,5,6,2,4,8,7};
int i,j;
for(i=1;i<9;i++)
{
if(n[i]!=i)//把n[i]放到它应该在的……
[/Quote]
此楼真的是正解??都没人怀疑啊 考虑下每次修改后都把大号位置上的数修改对了 可是小号位置上的数还是错误的呢 此时不就不能正确排序了 看看这个数组吧 3,4,2,5,1,经过上面的程序运行结果是1,5,3,4,2
yuanmeibin
2012-04-03
打赏
举报
回复
[Quote=引用 6 楼 的回复:]
这个条件比较特殊,所以可以实现O(n)的算法,也可以不交换2个数。如果a[j]!=j,则把a[j]中的元素放到它应在的位置,同时把要被覆盖的元素取出来。不停循环,一直到a[j] = j;
简单写一下代码:
for (i=1; i<=n; i++)
{
j = i;
while (a[j] != j)
{
cache = a[a[j]];
a[a[j]] = a[……
[/Quote]
这个应该不止o(n)的时间复杂度 最坏的情况下应该是o(n2)
challenge99
2009-09-03
打赏
举报
回复
12楼正解 :)
luotuo512
2009-09-03
打赏
举报
回复
哈哈哈,我来个搞笑的。
for(int i=0;i<n;i++) a[i]=i+1;
分析:时间复杂度为O(n),结果完全正确,排序过程无法确定。
所以这个题只是特殊情况啦。
selooloo
2009-09-03
打赏
举报
回复
排序算法的时间复杂度一般都是n^2,因为这个数组的特殊性,可以达到O(n)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n[9]={0,1,3,5,6,2,4,8,7};
int i,j;
for(i=1;i<9;i++)
{
if(n[i]!=i)//把n[i]放到它应该在的位置上
{
j=n[i];
n[0]=n[j];
n[j]=n[i];
n[i]=n[0];
}
}
for(i=1;i<9;i++)
printf("%-3d",n[i]);
printf("\n");
system("pause");
return 0;
}
n[0] 是交换变量,不参加排序,空间复杂度为1;
jinwei1984
2009-09-02
打赏
举报
回复
[Quote=引用 6 楼 whg01 的回复:]
这个条件比较特殊,所以可以实现O(n)的算法,也可以不交换2个数。如果a[j]!=j,则把a[j]中的元素放到它应在的位置,同时把要被覆盖的元素取出来。不停循环,一直到a[j] = j;
简单写一下代码:
for (i=1; i <=n; i++)
{
j = i;
while (a[j] != j)
{
cache = a[a[j]];
a[a[j]] = a[j];
a[j]
= cache;
}
}
虽然for 中嵌套了一个while,但最多循环2次。
[/Quote]
hemy818
2009-09-02
打赏
举报
回复
[Quote=引用 8 楼 mstlq 的回复:]
要交换做啥?
for(int i=0;i <n;++i)
data[i]=i+1;
就可以了吧……
实际上就是这样的
mstlq
2009-09-02
打赏
举报
回复
要交换做啥?
for(int i=0;i<n;++i)
data[i]=i+1;
就可以了吧……
刚吃饱头脑有点乱,如果错了请指正……
hemy818
2009-09-02
打赏
举报
回复
不好意思 我错了
whg01
2009-09-02
打赏
举报
回复
这个条件比较特殊,所以可以实现O(n)的算法,也可以不交换2个数。如果a[j]!=j,则把a[j]中的元素放到它应在的位置,同时把要被覆盖的元素取出来。不停循环,一直到a[j] = j;
简单写一下代码:
for (i=1; i<=n; i++)
{
j = i;
while (a[j] != j)
{
cache = a[a[j]];
a[a[j]] = a[j];
j = cache;
}
}
虽然for 中嵌套了一个while,但最多循环2次。
hoomey
2009-09-02
打赏
举报
回复
[Quote=引用 4 楼 hyram 的回复:]
有1,2,....一直到n的无序数组,似乎是说每个数都在,那么如果a[i]!=i,就交换a[i]和a[a[i]].
[/Quote]
正解
hyram
2009-09-02
打赏
举报
回复
有1,2,....一直到n的无序数组,似乎是说每个数都在,那么如果a[i]!=i,就交换a[i]和a[a[i]].
Victor_Dinho
2009-09-02
打赏
举报
回复
[Quote=引用 2 楼 hemy818 的回复:]
真是笑话
没有这样的算法
基于交换的算法平均需要 (n^2)时间
桶排序我没仔细学过 看样子像是所谓的 计数排序
这个算法是有限制条件 (记录在一个小范围内)通常不会有这样的数据
一般作为 基数排序的一个主要应用
[/Quote]
你看清楚LZ的条件,就是刚好可以用桶排序的~~~
hemy818
2009-09-02
打赏
举报
回复
真是笑话
没有这样的算法
基于交换的算法平均需要 (n^2)时间
桶排序我没仔细学过 看样子像是所谓的 计数排序
这个算法是有限制条件 (记录在一个小范围内)通常不会有这样的数据
一般作为 基数排序的一个主要应用
Victor_Dinho
2009-09-02
打赏
举报
回复
用桶排序
看http://www.cnblogs.com/relang99/archive/2008/12/23/1360769.html
有1,2,....
一直
到n的
无序
数组
,
求
排序算法
,
要
求
时间复杂度
为O(n),
空间复杂度
O(1)
1、有1,2,....
一直
到n的
无序
数组
,
求
排序算法
,并且
要
求
时间复杂度
为O(n),
空间复杂度
O(1),
使用
交换
,而且
一次
只能
交换
两
个数
。 #include void sort(int *a,int len) { int temp; for(int i = 0; i < len; ) { temp = a[a[i] - 1]; a[a[i] - 1] = a[i]; a[i]
现有1,2……
一直
到n的
无序
数组
,
求
排序算法
,并且
要
求
时间复杂度
为O(n),
空间复杂度
为O(1),
使用
交换
,而且
只能
交换
两
个数
现有1,2……
一直
到n的
无序
数组
,
求
排序算法
,并且
要
求
时间复杂度
为O(n),
空间复杂度
为O(1),
使用
交换
,而且
只能
交换
两
个数
这是今天遇到的一个笔试题,当时想到的思路就是把数值和
数组
下标关联起来,后来事实证明这个思路是正确的,但是我写的代码出现了一些小偏差,代码如下 [cpp] view plaincopy //错误代码:
有1,2...
一直
到n的
无序
数组
,
求
排序算法
,并且
要
求
时间复杂度
为O(n),
时间复杂度
为O(1)
提示:用
数组
值作为下标 分析: 对于一般
数组
的排序显然 O(n) 是无法完成的。 既然题目这样
要
求
,肯定原先的
数组
有一定的规律,让人们去寻找一种机会。 例如:原始
数组
: a = [ 10, 6,9, 5,2, 8,4,7,1,3 ] 如果把它们从小到大排序且应该是 b
有1,2,3,..n 的
无序
数组
,
求
排序算法
有1,2,3,…n 的
无序
数组
,
求
排序算法
。
要
求
时间复杂度
O(n),
空间复杂度
O(1)。
使用
交换
,而且
一次
只能
交换
两
个数
。(2020届鼎信通讯现场笔试题) 未排序的
数组
为arr1[] = {10,6,9,5,2,8,4,7,1,3},排序后的
数组
为arr2[]={1,2,3,4,5,6,7,8,9,10}。观察arr1与arr2的对应关系可知:arr1[i]在arr2中的下标为arr1[i]-...
1~n
无序
数组
时间复杂度
为O(n)排序
1~n
无序
数组
时间复杂度
为O(n)排序 有1,2,....
一直
到n的
无序
数组
,
求
排序算法
,并且
要
求
时间复杂度
为O(n),
空间复杂度
O(1),
使用
交换
,而且
一次
只能
交换
两
个数
.(华为)分析:
数组
的特点是值和下标满足一定的关系,以此作为
交换
的终止条件。但这个算法的
时间复杂度
如何证明是O(n)呢? #includeint main(){int a[] = {10
C语言
69,381
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章