作為乙個沒有任何程式設計基礎的人來說,新學一門程式語言是一件比較困難的事情。
語法和思維方式的轉變是乙個難點,但也還好。最困難的地方,是因為不常使用而導致的遺忘。
因此決定每每學到什麼新東西,在這裡記錄下來,以便以後常讀常新。今天寫的便是昨晚看到的氣泡排序。
假設這裡有乙個陣列,現在要將這個陣列從大到小排列起來。
int sr =;
思路:將陣列中相鄰兩個數進行比較,將較大的數放到左邊,將較小的數放到右邊。如下:
if(sr[i]1])
當i = 0時,便會將陣列中索引為0的數和索引為1的數按從大到小排列。因此,當i依次遞增時,如下:
for(int i=0; i
length-1;i++)
}
經過多次的交換之後,便將陣列中最小值移到了陣列末尾:
[43, 23, 65, 41, 54, 32, 12, 56, 22, 3]
進過一輪交換,我們將陣列中最小的值移到了陣列末尾,試想:如果將上面的交換重複sr.length-1次,那麼我們就可以將陣列中的值從大到小進行排序:
for(int j=0; jlength-1; j++)}}
system.out.println(arrays.tostring(sr));
結果:[65, 56, 54, 43, 41, 32, 23, 22, 12, 3]
雖然得到了結果,但分析上面的排序:當第一輪排列結束之後,已經將陣列中最小的數值3放置到了sr[9]。
但第二輪排序時,我們仍然將sr[8]與sr[9]進行了比較。而經過第一輪排序之後,sr[9]顯然已經是最小的,所以sr[8]與sr[9]的比較是毫無必要的。
同理我們可以分析得到後面幾輪排序中有多次比較都是毫無必要的。經優化後的**如下:
for(int j=0; jlength-1; j++)
}
}system.out.println(arrays.tostring(sr));
結果:[65, 56, 54, 43, 41, 32, 23, 22, 12, 3]
最後,還可以進一步分析:如果其中經過某一次的排序之後,陣列已經得到了我們想要的排序結果,那麼後面的比較排序過程就可以省略了。
如何知道陣列的排序結果已經是我們想要的?從下面的**塊可以得知:
for(int i=0; i
length-1;i++)
}
如果在某一輪比較中,如果陣列的排序結果已經是我們想要的,那麼**將不會走到if語句中。
因此我們可以在if語句中新增乙個判斷條件,如果已經得到我們想要的結果,就可以在上述**塊結束之後,退出排序。最後**如下:
for(int j=0; jlength-1; j++)
system.out.println(arrays.tostring(sr));
}if(sequence == true)
}system.out.println(arrays.tostring(sr));
結果和前面得到的結果一致。
水平所限,有所疏漏,多多包涵。。
排序演算法之簡單氣泡排序
我用的開發環境是vs2012,用的是c 語言,經過驗證,沒有問題,下面是 include using namespace std void buddle sort int array,int len int main 陣列長度 int len sizeof array sizeof int 呼叫排序...
數列排序之簡單的氣泡排序
如題所述,這就是乙個簡單的用氣泡排序解決數列排序的方法與解釋。題目採用藍橋杯基礎試題裡的basic 13 數列排序 問題描述 給定乙個長度為n的數列,將這個數列按從小到大的順序排列。1 n 200 輸入格式 第一行為乙個整數n。第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。輸出格...
排序之氣泡排序
例 將5個數字進行從大到小排序後輸出。輸入 35 99 18 12 76 輸出 99 76 35 18 12 對於例,氣泡排序大致的思路就是一趟一趟地迴圈比較,每一次迴圈的目的都是將未排序的數字中最小的數字移動到末尾。如 第一趟 xx xx xx xx 12 第二趟 xx xx xx 18 12 第...