iT邦幫忙

3

初階演算法--冒泡排序法 使用c#

c#

冒泡排序法<Bubble sort> 使用c#
鑒於近日去南部某家科技公司面試,其中有考到一題簡易演算法(也就是傳說中的泡沫排序法)
想不到我盡然花了將近10分鐘想
會不會是現在的工作過得太安逸了(誤

好吧,今天花點時間再把邏輯思緒整理一下,並且在這邊分享給需要的人

首先,我們先來預想一下
畫面上我要有兩個Label
用來呈現原始陣列內的數字排序、排序後的數字排序
以下我們已webform來實作

        <form id="form1" runat="server">
            <div>
                <asp:Label ID="Label1" runat="server" ></asp:Label>
                <br />
                <asp:Label ID="Label2" runat="server" ></asp:Label>
            </div>
        </form>

然後我們再Code Behind 開始思索

//我這邊需要一個int的陣列來塞入我要的數值
//所以來個
int[] aa = new int[5];    //你喜歡也可以用10....

//然後為了不想要數字很死,所以用個random來產生數字
Random a = new Random();
for (int i = 0; i <= 4; i++)
{
aa[i] = a.Next(0, 99);
}

//我們的陣列裡面都有數字後,就讓label1來顯示我們的原始排序
foreach (int r in aa)
{
Label1.Text += r.ToString() + ",";
}


//再來就是重頭戲拉~~
//由下可見,我們的第一個迴圈,就是跑陣列大小的次數
for (int i = 0; i <= aa.Length; i++)
{
         //再來就是第二個迴圈,跑 lenth-1 的次數
        for (int j = 0; j < aa.Length-1; j++)
        {
         //下方程式碼可見,只要是前一格大於後一個,就把他的位置做更換,再塞入陣列
        if (aa[j] > aa[j + 1]) {
        int temp = aa[j];
        aa[j] = aa[j + 1];
        aa[j + 1] = temp;
        }
}

//然後就是在把陣列中的數字排序印出來,大功告成~~
foreach (int r in aa)
{
    Label2.Text += r.ToString() + ",";
}

0
尼克
iT邦高手 1 級 ‧ 2015-01-21 14:49:43

哇靠!若是考這種題目我穩死無疑交白卷。Orz

記得寫上姓名黑

0
cheriish2001
iT邦新手 5 級 ‧ 2015-01-21 15:08:12

這真的沒有很難ㄛ~~
看一下我的註解 實作一下就豁然開朗啦

實務上也算是常用的東西喔

0
賽門
iT邦超人 1 級 ‧ 2015-01-21 15:55:48

第二個迴圈j, 不用每次都全部重排.
應該寫成

&lt;pre class="c" name="code">for (int j = 0; j &lt; aa.Length-1-i; j++)

因為第一次排, 最小的已放到最下面了, 所以第二次排可以不用再抓出來排.
這樣可以省時, 提高效能.

for (int j = 0; j < aa.Length-1-i; j++)

這樣更好...

&lt;pre class="c" name="code">for (int j = 0,len = aa.length-1; j &lt; len-i; j++)

不需要每次都把陣列的長度算一次

0
cheriish2001
iT邦新手 5 級 ‧ 2015-01-21 17:11:04

感謝simon581923大大提醒!~

0
mis2000lab
iT邦好手 1 級 ‧ 2015-01-21 18:13:45

我工作五年後,去找工作還有考智力測驗呢
還考國文、英文

如果是大公司,我會耐著性子試試看(當然也沒時間準備這些考試,直接上場)

若是小公司還搞這招,我就打電話跟他們婉拒了

老師啊~~
如果照您的等級來說當然婉拒拉XDDD

我們這種小咖還是得照著來><

0
wiseguy
iT邦超人 1 級 ‧ 2015-01-21 20:25:01

分享一個技巧:
要把兩個同類型的數字變數交換,不必寫

&lt;pre class="c" name="code">int temp = aa[j];  
aa[j] = aa[j + 1];  
aa[j + 1] = temp;

這樣需要多一個中間數。只需寫:

&lt;pre class="c" name="code">aa[j] ^= aa[j + 1];  
aa[j + 1] ^= aa[j];
aa[j] ^= aa[j + 1];

三次 XOR 運算就行了。

感謝大大提攜

這我倒是沒有多想

因為我很直觀的就多設一個Temp來暫存 XDD

0
summertw
iT邦好手 1 級 ‧ 2015-01-22 08:28:27

我曾經看過有一家公司的招考題是...
劃出九九乘法表及二分法索引的程式流程圖。
...
這種看似簡單但要劃出流暢的流程圖來,還要能解說,那就是一大考驗了。
...
該公司是要徵系統分析師..

0
外獅佬
iT邦大師 1 級 ‧ 2015-01-22 09:55:03

地表最強IDE---

不是Notepad嗎?瞎

0
一級屠豬士
iT邦高手 1 級 ‧ 2015-01-22 11:11:27

那個程式我就先不說了,年紀大了,天氣又冷,身體要緊.
那個什麼最強IDE,請問他可以用來寫 Erlang / Elixir嗎??

是號稱號稱

非我所指稱XDD

0
pantc328
iT邦研究生 1 級 ‧ 2015-01-26 09:36:39

for (int i = 0; i <= aa.Length; i++)
{
//再來就是第二個迴圈,跑 lenth-1 的次數
for (int j = 0; j < aa.Length-1; j++)
{


for(int i=0;i<= aa.Length;i++)
{
for(int j=i+1;j< aa.Length;j++)
{
}
}

我比較喜歡順序相同的
最近為考試而考試
有的書很清楚,有的書,比網路範例差太多,看到快丟了
同一本書,同一個問題,不同地方寫法不同
或有時正寫,有時反寫
有的課本就到處貼範例

順序一致看起來比較清楚,不然三個回圈,四個回圈後
你的Bugs就解不完(越小,越簡單,越容易被輕忽的地方,Bugs越難除錯)

我要留言

立即登入留言