lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

posted on 2020-03-07 17:22  艰苦奋斗中  阅读(1335)  评论(0编辑  收藏  举报