1.基本思想:每次比较两个相邻的元素,如果顺序错误,则交换这两个元素的位置。
例如:对5,3,4,9,6这五个数按从小到大排序,先比较第一位数5和第二位数3,则发现顺序错误,故进行交换,交换后则变为3,5,4,9,6,接下来继续比较第二位(5)与第三位(4)……一直到第四位与第五位比较。
2.原理:冒泡排序每趟只能将一个数归位,即第一趟只能将末位上的数归位(第一趟排序后9在末位),第二趟排序只能将倒数第二位的数归位(第二趟排序后6在倒数第二位),第三趟只能将倒数第三位上的数归位(5)……由此可见,对n个数进行排序则需要进行n-1趟。
3.代码:
#include<iostream>
using namespace std;
int bubble_sort(int a[], int len)
{
for (int i = 0; i < len-1; i++) //控制趟数
{ for (int j = 0; j < len - 1 - i; j++) //每一趟排好一个数,每一趟排序后减去1,则i趟排序后减去i,故为len - 1 - i
{
if (a[j] > a[j + 1])
{
int temp;
temp = a[j]; //记录次数
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
return 0;
}
int main()
{
int a[] = {5, 3, 4, 9, 6};
bubble_sort(a,5);
for (int j = 0; j < 5; j++) //输出排序后的数
{
cout << a[j] << " ";
}
return 0;
}
4.算法时间复杂度分析:
假设待排序的数组共有n个关键字,分最好情况和最坏情况讨论。
(1)若待排序的数组初始状态是正序的,则不需要排序,只需一趟就可完成排序。关键字的比较次数C和移动次数M分别为n-1和0。故最好情况下时间复杂度为O(n)。
(2)若待排序的数组初始状态是反序的,则需要进行(n-1)趟排序,每趟排序需要进行(n-i)次关键字比较,而每次比较都需记录三次移动(见代码注释记录移动处)。这种情况下比较和移动次数都为最大值:
比较次数C=n(n-1)/2=O(n^2)
移动次数M=3n(n-1)/2=O(n^2)
综上所述,冒泡排序总的平均时间复杂度为(n^2)。
注:
1.(n^2)表示n的平方。
2.若对时间复杂度概念不清楚,参见百度百科此处不再赘述。