1 void bubble_Sort(ElementType a[], int n) { 2 for (int p = n - 1; p >= 0; p--) {//需要p趟冒泡,也就是每次把一个最大的放到前面 3 int flag = 0;//标志是否发生元素交换 4 for (int i = 0; i < p; i++) { 5 if (a[i] > a[i + 1]) {//两两相互比较 6 swap(a[i], a[i + 1]); 7 flag = 1; 8 } 9 } 10 if (!flag) break;//如果一次冒泡没有发生交换,则已有序 11 } 12 }
//其实,冒泡排序次数就是序列中平均有序对的个数,插入排序也是如此
//而一个有n个元素的序列,平均有序对的个数为n * (n - 1) / 4
//因为每一次交换,消除一个逆序对
//逆序对就是 一个元素后面若有比它本身小的元素,则算一个逆序对。
//比如 5 3 4,包括(5,3),(5,4)这两个逆序对