1:簡介:
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。
它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。
這個算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端,由此而得名。
2:基本原理:
冒泡排序(BubbleSort)的基本概念是:依次比較相鄰的兩個數,將小的數放在前面,大的數??放在後面。即在第一趟:首先比較第一個和第二個數,將小的數放在前面,大的數放在後面。然後比較第二個數和第三個數,將小的數放在前面,將大的數放在後面,如此繼續,直到比較最後兩個數,將小的數放在前面,大的數放在後面。至此第一趟結束,將最大的數放在了最後。在第二趟:仍從第一對數開始比較(因為可能第二個數和第三個數的交換,使得第一個數不再小於第二個數),將小的數放在前面,將大的數放在後面,一直比較到倒數第二個數(倒數第一的位置已經是最大的了),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數了)。如此下去,重復以上過程,直至最終完成排序。
3:基本算法:
在這裡需要提前做一個聲明,我們在使用數組存儲數據的時候,不從下標0開始,這樣呢,可以方便我們一一對應著進行比較,第一個數據的下標就是1。
將待排序的數據存放到一個數組a[1]-a[n]中,我們假設需要將數據按照從小到大的順序排列。
例如,現在我們需要對數據30,10,20,60,25,40進行排序。
第一趟:
從第一個元素開始到第五個元素依次與其後面相鄰的數據進行比較。
1:將第一個數據和第二個數據進行比較,交換後得到:
10,30,20,60,25,40
2:將第二個數據和第三個數據進行比較,交換後得到:
10,20,30,60,25,40
3:將第三個數據和第四個數據進行比較,交換後得到:
10,20,30,60,25,40
4:將第四個數據和第五個數據進行比較,交換後得到:
10,20,30,25,60,40
5:將第五個數據和第六個數據進行比較,交換後得到:
10,20,30,25,40,60
此時,第一趟比較交換結束,最大的數60已經在6號位置了。
第二趟及第N趟就照著第一趟類推,但需要注意:第N次排序後數列倒數第N個數已經是第N大了,所以,每次排序的次數都將減少一次,直到排序次數只剩一次為止,詳細的請看代碼。
4:代碼:
核心代碼:
public int[] Pop(int[] listI)
{
//數組為null拋出異常
if (listI == null) throw new ArgumentNullException("listI");
//存儲臨時的需要冒泡的值
int temp = 0;
//從數組的第一個值遍歷到倒數第二個值
for (int i = 0; i < listI.Length - 1; i++)
{
//從比i大1的值開始遍歷到結束
//這裡比較的總是比i大的值,因為之前的值已經冒泡完成
for (int j = i + 1; j < listI.Length; j++)
{
//如果前一個值大於後一個值,他們交換位置
if (listI[i] > listI[j])
{
//交換位置
temp = listI[i];
listI[i] = listI[j];
listI[j] = temp;
}
}
}
return listI;
}
完整代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 冒泡排序實驗
{
class Program
{
static public int[] Pop_(int[] listI)
{
//數組為null拋出異常
if (listI == null) throw new ArgumentNullException("listI");
//存儲臨時的需要冒泡的值
int temp = 0;
//從數組的第一個值遍歷到倒數第二個值
for (int i = 0; i < listI.Length - 1; i++)
{
//從比i大1的值開始遍歷到結束
//這裡比較的總是比i大的值,因為之前的值已經冒泡完成
for (int j = i + 1; j < listI.Length; j++)
{
//如果前一個值大於後一個值,他們交換位置
if (listI[i] > listI[j])
{
//交換位置
temp = listI[i];
listI[i] = listI[j];
listI[j] = temp;
}
}
}
return listI;
}
static void Main(string[] args)
{
int[] a = {3,5,23,6,3,77,4,8,5,8,3 };
foreach (int i in Pop_(a))
Console.Write(i.ToString() + ",");
Console.ReadLine();
}
}
}