0.簡介
交換排序的基本思想是:兩兩比較,如果兩個記錄不滿足次序要求,則進行交換,直到整個序列全部滿足要求為止
冒泡排序是一種最簡單的交換排序方法,它通過兩兩比較相鄰記錄,如果發生逆序,則進行交換,從而使小的記錄如氣泡一樣逐漸往上“漂浮”(左移),或者使大的記錄如石塊一樣逐漸往下“墜落”(右移),即升序排列
1.算法思想
a.設待排序的記錄存放在數組r[1..n]中。首先將第1個記錄和第2個記錄進行比較,若為逆序(r[1]>r[2]),則交換。然后比較第2個和第3個,依次類推,直到第n-1個和第n個比較完為止。上述過程稱作第1趟排序,其結果使得最大的記錄放到最后的位置上
b.然后進行第2趟排序,對前n-1個記錄進行同樣操作,其結果使得次大的記錄放到n-1的位置上
c.重復上述過程,直到某一趟排序過程中沒有進行過交換記錄的操作,說明完成了排序
例:
起始:{1,2,5,4,3}
第1趟:{1,2,4,3,5}
第2趟:{1,2,3,4,5}
第3趟:結束排序算法
即每一趟確定1個記錄的最終位置
2.算法實現
1 using System; 2 using System.Collections.Generic; 3 4 namespace TestSort 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 List<int> list = new List<int> { 49, 38, 65, 97, 76, 13, 27, 49}; 11 12 Program p = new Program(); 13 p.Print(list, "排序前:"); 14 p.BubbleSort(list); 15 p.Print(list, "排序后:"); 16 17 Console.ReadKey(); 18 } 19 20 void Print(List<int> list, string tag) 21 { 22 string str = tag; 23 for (int i = 0; i < list.Count; i++) 24 { 25 str += list[i].ToString(); 26 str += ","; 27 } 28 Console.WriteLine(str); 29 } 30 31 //冒泡排序 32 void BubbleSort(List<int> list) 33 { 34 int m = list.Count - 1; 35 int flag = 1;//flag用來標記某一趟排序是否發生交換(1表示進行了交換) 36 while ((m > 0) && (flag == 1)) 37 { 38 flag = 0;//flag置為0,如果本趟排序沒有發生交換,則不會執行下一趟排序 39 for (int j = 0; j < m; j++) 40 { 41 if (list[j] > list[j + 1]) 42 { 43 flag = 1; 44 45 //交換 46 int temp = list[j]; 47 list[j] = list[j + 1]; 48 list[j + 1] = temp; 49 } 50 } 51 m--; 52 } 53 } 54 } 55 }
結果:
3.算法分析
a.時間復雜度
最好情況(初始序列為正序):只需進行一趟排序
最壞情況(初始序列為正序):需進行n-1趟排序
平均情況:O(n2)
b.空間復雜度
只有在交換時需要一個輔助空間用做暫存記錄,所以為O(1)
4.算法特點
a.是穩定排序
b.可提前結束算法
c.當初始記錄無序,n較大時,此算法不宜采用