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较大时,此算法不宜采用