Re: [問題] 請問氣泡排序法怎麼讀

看板C_and_CPP作者 (喲)時間12年前 (2012/04/01 14:39), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《popo14777 (草草)》之銘言: : ※ 引述《chessjim (jim)》之銘言: : : ※ 引述《popo14777 (草草)》之銘言: : : : void bubblesort(int *data, int n) : : : { : : : int i, j, temp; : : //共做n次內層迴圈 : : : for (i=n-1; i>0; i--) : : : { : : //檢視到前i-1個數即可;(第i個數已經排序好了) : : : for (j=0; j<=i-1; j++) : : : { : : //如果data的下一個值比目前的值大的話 : : : if (data[j] < data[j+1]) : : : { : : //把data[j]的值和data[j+1]的值交換 : : : temp=data[j]; : : : data[j]=data[j+1]; : : : data[j+1]=temp; : : : } : : : } : : : } : : : } : : : 請大大幫解讀一下 : : : 小弟我看了很多次都看不懂 : : : i跟j到底是什麼,尤其是for跟if那邊 : : : data= 5 7 2 6 9 1 : 還是看不懂>< : 可以再詳細一點嗎@@? : 謝謝 先看這一小段: for (j=0; j<=i-1; j++) { if (data[j] < data[j+1]) { temp=data[j]; data[j]=data[j+1]; data[j+1]=temp; } } 這段是說,把一個陣列從頭到尾,每二個相鄰的數互相比較,小的數放前面, 大的數放後面. 也就是說二個數如果前面的數較大,二個數就互相調換位置. 並且整體來看,因為是前面往後面做,所以合起來的效果是陣列0到i的範圍內, 最大的數字一定放在最後面,而除了最後面一個樹之外,其他數的順序仍不確定. 以上的掃描並隨機互換的工作,由於使用i-1來決定處理的陣列範圍,於是我們 可以藉由控制i的大小來決定j迴圈一次處理陣列多少個數. 所以來看j迴圈塞進 i迴圈的樣子: for (i=n-1; i>0; i--) { for (j=0; j<=i-1; j++) { if (data[j] < data[j+1]) { temp=data[j]; data[j]=data[j+1]; data[j+1]=temp; } } } 陣列有n個數, j 迴圈先做0~n-1範圍,然後再做0~n-2範圍,然後是0~n-3範圍, ... i 控制 j 迴圈的迴圈次數,從 n-1, n-2, n-3, 一直降到 1. 那就表示, j迴圈做一次掃描並隨機互換的工作,最後的效果是範圍中最大數字放在最後面; i迴圈控制j迴圈處理陣列的範圍,先是最大的範圍,然後比最大範圍少最後一個數的範圍, 然後比最大範圍少最後二個數的範圍,如此處理範圍愈來愈小,而處理範圍之後的數 是之前依序將最大數抓到後面,第二大數抓到後面,第三大數抓到後面...依序做到 最後, j 迴圈只處理二個數,處理完就結束,而此時範圍之外,倒著看是由大排列到小的 數字. 你說說看, i代表什麼, j代表什麼? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.112.225.30

04/01 19:56, , 1F
好人...
04/01 19:56, 1F

04/06 14:58, , 2F
推這篇0..0
04/06 14:58, 2F
文章代碼(AID): #1FT_WRnX (C_and_CPP)
文章代碼(AID): #1FT_WRnX (C_and_CPP)