Re: [問題] 請問氣泡排序法怎麼讀
※ 引述《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
04/06 14:58, 2F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):