Re: [問題] 資結-bubble程式

看板Grad-ProbAsk作者 (艾斯寇德)時間15年前 (2009/04/30 04:00), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《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

04/30 05:34, , 1F
謝謝您的詳細解說,感謝
04/30 05:34, 1F
文章代碼(AID): #19-B725C (Grad-ProbAsk)
文章代碼(AID): #19-B725C (Grad-ProbAsk)