1、概述:
- 已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。
- 再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。
- 这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。
- 再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
- 降序排列与升序排列相类似,若a[1]小于a[2]则交换两者的值,否则不变,后面以此类推。
- 总的来讲,每一轮排序后最大(或最小)的数将移动到数据序列的最后,理论上总共要进行n(n-1)/2次交换。
- 优点:稳定
- 时间复杂度:理想情况下(数组本来就是有序的),此时最好的时间复杂度为o(n),最坏的时间复杂度(数据反序的),此时的时间复杂度为o(n*n) 。
- 冒泡排序的平均时间负责度为o(n*n).
- 缺点:慢,每次只移动相邻的两个元素。
2、图解:
3、代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace 冒泡排序
8 {
9 class Program
10 {
11
12 static void Main(string[] args)
13 {
14 int[] data = new int[] { 42, 20, 17, 27, 13, 8, 17, 48,1,22 };
15 BubbleSort(data);
16 foreach (var temp in data)
17 {
18 Console.Write(temp + " ");
19 }
20 Console.ReadKey();
21 }
22
23 //以下展示的是两种实现方法,推荐使用第一种:
24
25 /// <summary>
26 /// 最底下元素对应最小索引
27 /// </summary>
28 /// <param name="dataArray"></param>
29 static void BubbleSort(int[] dataArray)
30 {
31 for (int i = 0; i < dataArray.Length; i++) //有多少个数就要遍历多少趟
32 {
33 for (int j = 0; j < dataArray.Length - 1 - i; j++)
34 //每一次会将最小的一个排在首位,所以次数会依次减少 -i只是为了性能考虑,因为每一次都会将最大值放到最后,所以最后一个值可以随趟数进行减少
35 {
36 if (dataArray[j] > dataArray[j + 1]) //交换位置
37 {
38 int temp = dataArray[j];
39 dataArray[j] = dataArray[j + 1];
40 dataArray[j + 1] = temp;
41 }
43 }
44 }
45 }
46
47 //从上到下
48 //static void BubbleSort(int[] dataArray)
49 //{
50 // for (int i = 0; i < dataArray.Length; i++)
51 // {
52 // for (int j = dataArray.Length - 1; j > i; j--)
53 // {
54 // if(dataArray[j]<dataArray[j-1]) //如果前一个元素大于最后面一个元素则交换位置
55 // {
56 // int temp = dataArray[j];
57 // dataArray[j] = dataArray[j - 1];
58 // dataArray[j - 1] = temp;
59 // }
60 // }
61 // }
62 //}
63 }
64 }