冒泡排序比较表中的相邻元素,如果它们是逆序的话,就交换它们的位置。重复多次以后,最终,最大的元素就“沉到”列表的最后一个位置。第二遍操作将第二大的元素沉下去。这样一直做,直到n-1遍以后,该列表就排好序了。第i(0<=i<=n-2)遍冒泡排序可以用下面的示意图来表示:
该算法的伪代码:
BubbleSort(A[0...n-1]) //该算法用冒泡排序对数组A[0...n-1]进行排序 //输入:一个可排序数组A[0...n-1] //输出:非降序排列的数组A[0...n-1] for i←0 to n-2 do for j←0 to n-2-i do if A[j+1]<A[j] swap A[j] and A[j+1]
对于所有规模为n的数组来说,该冒泡排序版本的键值比较次数都是相同的。
但它的键交换次数取决于特定的输入。最坏的情况就是遇到降序排列的数组,这时,键交换次数和键比较次数是相同的。
改进:如果对列表比较一遍之后没有交换元素的位置,那么这个表已经有序,我们可以停止这个算法了。
它的效率着实低。实际上,即使在初等排序方法当中,冒泡排序也不是一个好的选择。
C++代码:
#include<iostream> using namespace std; void BubbleSort(int a[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (a[j+1] < a[j]) swap(a[j], a[j+1]); } } } int main() { int a[] = {89, 45, 68, 90, 29, 34, 17}; BubbleSort(a, sizeof(a) / sizeof(a[0])); for (int k = 0; k < sizeof(a) / sizeof(a[0]); k++) { cout << a[k] << " "; } cout << endl; return 0; }