冒泡排序

Posted on 2020-05-09 10:02  黑炽  阅读(130)  评论(0编辑  收藏  举报
 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)这两个逆序对