有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 打赏 收藏 转发到动态 举报
写回复
用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

69,381

社区成员

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

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