作者sunneo (艾斯寇德)
看板Grad-ProbAsk
标题Re: [问题] 资结-bubble程式
时间Thu Apr 30 04:00:00 2009
※ 引述《icrts (居天下之广居)》之铭言:
: ※ 引述《bernachom (Terry)》之铭言:
: : 我程式很差...想问一些东西
: 手痒还是回一篇好了.
: 这类的问题,建议你先了解这个演算法是在做些什麽
: 然後再去看code,把code对应到程式码,会比较好懂
: : Void bubble_sort(int list[],int n) #这是在说list[]有n个格子吗?
: 首先这边的宣告让我觉得有点诡异, int list[] 传的是整数,
: 但是依据我对程式的了解,这边应该是要传array的位址,该改为
: int *list。(但不是很确定,有望##确认) //如果是pseudo code就别管它
int* a
在参数上可以等於int a[]
只有在二维才有一点点差别
: 再来,int n所表示的是每次call这个function同时会传一个参数
: 给这个function。在这里依照bubble sort演算法来说传递的是list的
: 格子数没错,但其实表示的应该是要sort的数为前面n个。
: : {
: : int tag,i,j;
: : for(i=1;i<n;i++)#i小於array格子就往右移?
: 这边应该说的是,这个找最大值的行为总共做了几次。
如果单单翻译程式码的话
for( i=1; i<n; i++)
i初始为1
在接下来的指令部分会在 i<n的条件下执行
i++是在下一伦才开始作。
: : {
: : tag=0;
: : for(j=1;j<n-i;j++)#这行不太清楚..j<剩下的格子数?
j初始为1
下面的程式码在j< n-i 下完成
同上个人说法,最大值会跑到最後面,所以内层其实不需要继续往先前已经排过的
数字找了,因为在序列中不可能找到比排过的最大值还大的数。
所以可以直接把排过的部分省略掉。
: 在bubble sort演算法中,上一个for回圈表示的i是做了第几次
: 而每做一次最大的那个值就会跑到最後面
: 所以要比较出最大的值,就从第一个开始往後找
: : {
: : if list[j]>list[j+1]#为什麽j会>j+1 ???
j > j+1 跟
list[ j ] > list[ j+1 ]不同
下面是取得list的第j个以及第j+1个
: 在此如果有找到前面的值比後面的大的话
: 就将两数交换位置
: : {
: : swap(list[j],list[j+1]);
: : tag=1;
: : }
: : }
: 做完一次for(j=..)之回圈一次可以确保最大值在最後方
: : if tag==0 break;
tag被设为1的情形只有在找到list[ j ] > list[ j+1 ]的状态。
所以当tag保持0的时候,表示整个阵列都是递增/递减状态。
void bubble_sort( int list[], int n ){
int findGreater, i, j;
for( i = 0; i < n; i++ ) { /* i为[0 ... n-1] */
findGreater = 0; /* 令findGreater为0 */
for( j = 0; j < n-i; j++ ) {
if( list[ j ] > list[ j+1 ] ) { /* 如果第j个 > j+1个 */
swap( list[ j ], list[ j+1 ] ); /* 交换 */
findGreater = 1; /* 标记有出现较大的部分 */
}
}
if( !findGreater ) { /* 如果整个阵列是递增状态则不需排序 */
break;
}
}
}
原po所打的算是pseudo code,因为c语言的阵列不是以1为底的,
但题目没有说他是c语言,如果是一个simulation language如slx
或者matlab,阵列的确是以1为底。
另外假使是c语言 if 叙述後面要有括号的,所以他不是c语言。
且if tag=1,equal跟assign会混淆的,如果有个程式写着
if( a = 0 ){
say("you approach Unreachable code ... wtf ?");
}
这如果在考试的时候,评分成了很大的问题吧。
说不定写了两种答案的人还会被改考卷的扣分。(今年我想要当作他是assign)
(明年我决定当他是equal)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.227.123.187
1F:推 bernachom:谢谢您的详细解说,感谢 04/30 05:34