1.冒泡排序是一种非常简单的排序算法,用时间换取空间,属于比较排序。经过比较和交换将最小/大的元素慢慢的“浮”到数组的顶端,从而达到排序效果,因此称为“冒泡排序”。
2.原理:
(1)目标:将元素个数为N的待排序数组arr排成递增数组。
(2)从数组第一个元素开始,每相邻两个元素做比较,当时,不交换位置,继续比较;当
时,交换位置,比较n-1次;
(3)重复(2)操作,比较n-2次;
(4)重复(2)操作,比较n-3次;
(5)...
(6)重复(2)操作,比较1次;
(7)最后得到递增数组。
如图:
3.时间复杂度:
(1)最好时间复杂度:(待排数组为有序序列,只比较,不交换)
<1>第1次遍历所用时间:n-1
<2>第2次遍历所用时间:n-2
<3>
<4>第n-1次遍历所用时间:1
<5>总计时间
(2)最坏时间复杂度:(待排数组为逆序,每一次比较都要进行交换)
<1>一次比较交换所用时间:3
(交换操作:temp=arr[i]; arr[i]=arr[i+1];arr[i+1]=temp)
<2>第1次遍历比较:3(n-1)
<3>第2次遍历比较:3(n-2)
<4>
<5>第n-1次遍历比较:3
<6>总计比较次数
综上所述,冒泡排序时间复杂度
4.空间复杂度:
这里空间复杂度指的是交换元素时的那个临时空间变量所占的内存空间(即temp),与问题规模大小(N)无关。
故冒泡排序空间复杂度
5.优点:简单,稳定
6.缺点:效率低
7.代码(以上图为例):
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
int arr[10] = { 3,4,6,7,1,2,8,9,5,0 }; //待排数组
int temp;
int num = 9;
for (int i = 0; i < 10; i++) { //冒泡排序
for (int j = 0; j < num; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
num--;
}
for (int i = 0; i < 10; i++) { //输出数组
cout << arr[i] << " ";
}
system("pause");
}