免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: samhoo
打印 上一主题 下一主题

挑战数组腾挪大法 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2002-10-26 02:34 |只看该作者

挑战数组腾挪大法

您的高程调试过吗?

论坛徽章:
0
22 [报告]
发表于 2002-10-26 10:50 |只看该作者

挑战数组腾挪大法

sorry, 少打了一个符号...


int MyCode ()  // return x position
{
   long L [ 1000 ], l&#59;
   int s, e&#59;

   for ( s = 0, e = 999&#59; s < e&#59
   {
       if ( L [ s ] >;= X )  // !!!!!!!! should be >;= X
       {
           l = L [ e ]&#59;
           L [ e -- ] = L [ s ]&#59;
           L [ s ] = l&#59;
       }
       else
           s ++&#59;
   }
   return s&#59;
}

论坛徽章:
0
23 [报告]
发表于 2002-10-26 10:51 |只看该作者

挑战数组腾挪大法

菜鸟!知道思路了还弄那么复杂,绝对菜鸟!

论坛徽章:
0
24 [报告]
发表于 2002-10-26 11:03 |只看该作者

挑战数组腾挪大法

对比一下 samboo 和 aegis 的程序……

什么叫 c 语言的简洁美?

所谓菜鸟,就是把简单的事情越搞越复杂
所谓高手,就是把看似复杂的事情弄简单

还有 samboo 你的 swap 实现不是 c 程序员的,是标准的谭笨蛋的 basic
要不要我教教你?

论坛徽章:
0
25 [报告]
发表于 2002-10-26 11:44 |只看该作者

挑战数组腾挪大法

aegis,拜托你把程序调过了,再来充大佬,行吗?
别以为记住了几个运算符的优先级,就可以跳来跳去,娱乐大众。

你的两个错误结果:
L[]=16838 5758 10113 17515 31051 5627 23010 7419 16212 4086
--------------------------------------------------------------------
incorrect.
--------------------------------------------------------------------
position=8
L[]=16838 5758 10113 17515 4086 5627 23010 7419 16212 31051

X=5
L[]=7 9 5 1 5 5 5 8 5 1
--------------------------------------------------------------------
incorrect.
--------------------------------------------------------------------
position=2
L[]=1 1 5 5 5 5 8 5 9 7

论坛徽章:
0
26 [报告]
发表于 2002-10-26 13:37 |只看该作者

挑战数组腾挪大法

你是一个大笨蛋,没看我说的吗?这个程序适用于 L [1000] 中没有重复的 X&#59;

问题:给定一个数组long L[1000],且已知X是其中的 !一个! 元素,如何使得
小于X的元素位于数组左边,大于X的元素位于数组右边,并得到X在数组中的下标。

7 9 5 1 5 5 5 8 5 1   里面有几个 5 ?

你不识数啊?

论坛徽章:
0
27 [报告]
发表于 2002-10-26 13:46 |只看该作者

挑战数组腾挪大法

你的算法的 时间复杂度是多少? O(n)? 呸!

论坛徽章:
0
28 [报告]
发表于 2002-10-26 19:06 |只看该作者

挑战数组腾挪大法

下面引用由aegis2002/10/25 04:05pm 发表的内容:
菜鸟啊菜鸟,一群菜鸟!谭笨蛋的书看多了吧?只会照抄,没有一点脑子!
无论干什么,都要先考虑算法!
比 x 小的放在前面,比 x 大的放到后面!算法都告诉你们了,还不会?!
从前面开始,比 x 小,则跳过,比 x ...

这位非菜鸟,你好
谭笨蛋?你说的是谭浩强谭老先生吗?谭老先生的书怎么了?你看过吗?你知道谭老先生的书的目的是什么吗?我记得我看的第一本C语言的书就是谭老先生的书.是他让我认识了C,试问这里有几位没有看过谭老先生的书?又有几个不知道谭老先生呢?单这点.老先生让我敬佩.他的书是给初学者认识C接解C而不是要把读者培养成为工程师或程序员.网上许多人说老先生的书看后什么都懂,但就是不会编程.这说明老先生的目的已经达到了.懂而不会编程?我不知道哪个人能把什么东西看会的.我也不知道为什么那么多学校为什么要把老先生的书作为学生学习C的第一本教材.如果说有一本书可以适用于一个程序员的各个阶段,我很想要这本书,你有吗?望借我一看.如果你根本没有看过老先生的书我想你没有资格对老先生的书作任何评价.


话说远了,就以这个贴子来说吧.我很欣慰你还知道有算法.我也很高兴又认识了你这么一位&quot;非菜鸟&quot;.更高兴的是你居然也知道你的算法对原始数据有要求,而且是要求X在这么多数中不能重复.
你的程式是以1000个数的数组.1000个数中不能有重复的数?是原始数据要求算法还是算法来决定原始数据.我这个菜鸟不太清楚,忘点明.如果就为了1000个数就要用算法,还要考虑时间空间复杂度? 我不知道你脑子里有没有时间空间的概念. 不知道你的&quot;算法&quot;是否有实用价值.上万,百万个数有没有可能不重复?是否还要求原始数据已经排好序你直接找就行了???

  说起来好象很容易啊.菜鸟们随便改改就行了,要解决上面说的问题你觉得随便改改就行吗?

我很想听听&quot;高手&quot;的&quot;高见&quot;.你如何解决这个问题.希望你只是随便改改而没有浪费你太多的时间.

论坛徽章:
8
申猴
日期:2014-01-01 22:11:07白羊座
日期:2014-11-18 20:53:022015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之四川
日期:2016-01-19 18:39:36综合交流区版块每日发帖之星
日期:2016-06-07 06:20:0015-16赛季CBA联赛之广东
日期:2016-10-30 11:34:40CU十四周年纪念徽章
日期:2016-11-13 10:06:5715-16赛季CBA联赛之同曦
日期:2022-08-28 15:58:19
29 [报告]
发表于 2002-10-26 19:21 |只看该作者

挑战数组腾挪大法

声明一下,我的算法的复杂度不是O(n^2),而是O(n),如果写成下面这样,将更明显些(不过以前写的是有些问题(int pos应为int *pos),在网吧上网有些匆忙,现在改一下):
int specsort(long L[],long X){
int i,j,tmp1,tmp2=999,pos&#59;
for(i=0&#59;i<tmp2&#59;i++){
if(L>;X){
for(j=tmp2&#59;j<i&#59;j--){
if(L[j]<x){
tmp=L[j]&#59;
L[j]=L&#59;
L=tmp&#59;
tmp2=j&#59;
break&#59;
}
}
if(j==i) break&#59;
}
else if(L==x) pos=i&#59;
}
}
tmp=L[pos]&#59;
L[pos]=L[tmp2-1]&#59;
L[tmp2-1]=tmp&#59;
pos=tmp2-1&#59;
return pos&#59;
}

论坛徽章:
0
30 [报告]
发表于 2002-10-26 22:01 |只看该作者

挑战数组腾挪大法

#include        <stdio.h>;
#include        <fcntl.h>;
#include        <sys/errno.h>;
extern int      errno&#59;
#define         MAX_SIZE        10
#define         OBJECT_NUMBER   7

#define         INT_EXCHANGE(a,b) \
       {\
               int     temp_int&#59; \
               temp_int = my_array[a]&#59; \
               my_array[a] = my_array&#59; \
               my_array = temp_int&#59; \
               }

main ()
{
int   my_array[MAX_SIZE] = {3,5,7,1,8,7,6,7,2,0}&#59;
int   last_less_room, last_more_room,
       object_current_room, temp_room&#59;

for (last_less_room = 0, last_more_room = MAX_SIZE -1 &#59;
               last_less_room < last_more_room&#59
   {
{
int i&#59;
for (i=0&#59; i<MAX_SIZE&#59; i++) printf (&quot;%d &quot;, my_array)&#59;
printf (&quot;\n&quot&#59;
}
     while (my_array[last_less_room] < OBJECT_NUMBER) last_less_room ++&#59;
     while (my_array[last_more_room] >; OBJECT_NUMBER) last_more_room --&#59;
     if (last_less_room >;= last_more_room)
       {
         break&#59;
       }

     if (my_array[last_less_room] == my_array[last_more_room])
       {
for (temp_room = last_less_room+1&#59;
(temp_room<(last_more_room-1))
&amp;&amp; (my_array[temp_room] == OBJECT_NUMBER)&#59; temp_room++)&#59;
if (my_array[temp_room] == OBJECT_NUMBER)
   {
     break&#59;
   }
else if (my_array[temp_room] >; OBJECT_NUMBER)
   {
     INT_EXCHANGE (temp_room, last_more_room)&#59;
   }
else if (my_array[temp_room] < OBJECT_NUMBER)
   {
     INT_EXCHANGE (temp_room, last_less_room)&#59;
   }

continue&#59;
       }

     if (my_array[last_less_room] == OBJECT_NUMBER)
       {
         object_current_room = last_less_room&#59;
         while (((last_less_room + 1) < (MAX_SIZE - 1))
               &amp;&amp; (my_array[last_less_room + 1] < OBJECT_NUMBER))
           {
             last_less_room ++&#59;
           }
         INT_EXCHANGE (last_less_room, object_current_room)&#59;
         if (((last_less_room + 1) < MAX_SIZE)
               &amp;&amp; (my_array[last_more_room] < OBJECT_NUMBER))
           {
             INT_EXCHANGE (last_less_room + 1, last_more_room)&#59;
           }
       }
     if (my_array[last_more_room] == OBJECT_NUMBER)
       {
         object_current_room = last_more_room&#59;
         while (((last_more_room - 1) >; 0)
               &amp;&amp; (my_array[last_more_room - 1] >; OBJECT_NUMBER))
           {
             last_more_room --&#59;
           }

         INT_EXCHANGE (last_more_room, object_current_room)&#59;
         if ((last_more_room >; 0)
               &amp;&amp; (my_array[last_less_room] >; OBJECT_NUMBER))
           {
             INT_EXCHANGE (last_more_room - 1, last_less_room)&#59;
           }
       }

   }
{
int i&#59;
for (i=0&#59; i<MAX_SIZE&#59; i++) printf (&quot;%d &quot;, my_array)&#59;
printf (&quot;\n&quot&#59;
}
}

输出的结果是:
3 5 7 1 8 7 6 7 2 0
3 5 1 7 0 7 6 7 2 8
3 5 1 0 7 2 6 7 7 8
3 5 1 0 2 7 6 7 7 8
3 5 1 0 2 6 7 7 7 8
3 5 1 0 2 6 7 7 7 8
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP