本节内容:
1:冒泡排序说明:
2:冒泡排序实现:
3:冒泡排序的时间复杂度
1:冒泡排序说明:
冒泡排序也是最简单最基本的排序方法之一。冒泡排序的思想很简单,就是以此比较相邻的元素大小,将小的前移,大的后移,就像水中的气泡一样,最小的元素经过几次移动,会最终浮到水面上。
举例分析说明一下,如下数据:
2 7 4 6 9 1 首先比较最后两个数字,发现1比9小,于是前移
2 7 4 6 1 9 然后比较6和1
2 7 4 1 6 9 继续前移,然后是4和1
2 7 1 4 6 9 7和1比较
2 1 7 4 6 9 2和1
1 2 7 4 6 9 至此,第一趟冒泡过程完成,最小的元素1被移到第一个,不再参与后面的排序过程。下一趟冒泡过程同理,比较6和9,以此类推,最终得到结果。
代码
cout << "bubble sort:" << endl;
printline("before sort:", v);
for (int i=0; i<v.size(); i++){
int temp = 0;
for(int j=v.size()-1; j>0; j--){
if (v[j] < v[j-1]){
temp = v[j];
v[j] = v[j-1];
v[j-1] = temp;
}
}
}
printline("after sort:",v);
2:冒泡排序实现:
class Program { static void Main(string[] args) { int[] num1 = { 34, 11, 3, 4, 67, 8 }; for (int j = 0; j < num1.Length;j++ ) //一共进行n个元素-1次 { for (int i = 0; i < num1.Length - 1-j; i++) //内循环的长度应该是一共循环的长度,减去已经排序好的 { if (num1[i]<num1[i+1]){ //进行升序排序,每次都是当前i跟下一次i的比较 int temp = num1[i]; num1[i] = num1[i + 1]; num1[i + 1] = temp; } } } foreach (int item in num1) { Console.WriteLine(item); } Console.ReadKey(); } }
3:冒泡算法复杂度
- 时间复杂度:O(n^2)
冒泡排序耗时的操作有:比较 + 交换(每次交换两次赋值)。时间复杂度如下:
1) 最好情况:序列是升序排列,在这种情况下,需要进行的比较操作为(n-1)次。交换操作为0次。即O(n)
2) 最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。交换操作数和比较操作数一样。即O(n^2)
3) 渐进时间复杂度(平均时间复杂度):O(n^2)
- 空间复杂度:O(1)
从实现原理可知,冒泡排序是在原输入数组上进行比较交换的(称“就地排序”),所需开辟的辅助空间跟输入数组规模无关,所以空间复杂度为:O(1)
(三)稳定性
冒泡排序是稳定的,不会改变相同元素的相对顺序。