冒泡排序的基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在后面。
由於在排序過程中總是小數往前放,大數往后放,相當於氣泡往上升,所以稱作冒泡排序。
冒泡排序有兩個很明顯的優勢:
1.“編程復雜度”很低,很容易寫出代碼;
2.具有穩定性,這里的穩定性是指原序列中相同元素的相對順序仍然保持到排序后的序列,而堆排序、快速排序均不具有穩定性。
下面通過一個例子來了解冒泡排序的具體含義:
{130, 28, 345, 299, 40, 30, 201}
第一遍循環:
由此思想,我們可以實現冒泡排序的代碼:
namespace BubbleSort { class Program { private void Func(int[] Arg) { //外循環每次把參與排序的最大數排在最后 for (int i = 1; i < Arg.Length; i++) { int a = 0; // 臨時變量 //內層循環負責對比相鄰的兩個數,並把最大的排在后面 for (int j = 0; j < Arg.Length-i; j++) { //如果前 一個數大於后一個數,則交換兩個數 if (Arg[j] > Arg[j + 1]) { a = Arg[j + 1]; Arg[j + 1] = Arg[j]; Arg[j] = a; } } //直接打印 //Console.WriteLine("{0},{1},{2},{3},{4},{5},{6}", Arg[0], Arg[1], Arg[2], Arg[3], Arg[4], Arg[5], Arg[6]); //Console.ReadLine(); //用一個循環訪問數組里的元素並打印 for (int k = 0; k < Arg.Length; k++) { Console.WriteLine(Arg[k]); } Console.ReadLine(); } } static void Main(string[] args) { Program p = new Program(); int[] Arg = { 130, 28, 345, 299, 40, 30, 201 }; p.Func(Arg); } } }
由結果我們知道,冒泡排序是經過n-1趟子排序完成的,即使我們在第五次循環就已經得出了想要的結果,但是還是循環了6次。
由此我們可以看到對數據龐大的排序,冒泡排序並不適合。
其實我們可以設置一個標志位來解決這個問題,具體方法如下:
namespace BubbleSort { class Program { private void Func(int[] Arg) { int Flag = 1; //標志位 //外循環每次把參與排序的最大數排在最后 for (int i = 1; i < Arg.Length; i++) { if (Flag == 1) { int a = 0; // 臨時變量 Flag = 0; //內層循環負責對比相鄰的兩個數,並把最大的排在后面 for (int j = 0; j < Arg.Length - i; j++) { //如果前 一個數大於后一個數,則交換兩個數 if (Arg[j] > Arg[j + 1]) { a = Arg[j + 1]; Arg[j + 1] = Arg[j]; Arg[j] = a; Flag = 1; } } //直接打印 Console.WriteLine("{0},{1},{2},{3},{4},{5},{6}", Arg[0], Arg[1], Arg[2], Arg[3], Arg[4], Arg[5], Arg[6]); Console.ReadLine(); ////用一個循環訪問數組里的元素並打印 //for (int k = 0; k < Arg.Length; k++) //{ // Console.WriteLine(Arg[k]); //} //Console.ReadLine(); } } } static void Main(string[] args) { Program p = new Program(); int[] Arg = { 130, 28, 345, 299, 40, 30, 201 }; p.Func(Arg); } } }