基本思想: 一种简单的排序算法,其重复地走访待排序数列,依次比较两个相邻元素,如果逆序则交换,直到没有反序的记录为止;可以保证每访问一趟后,最大值位于最后面。冒泡排序的动态图示如下所示:
复杂度分析:最坏时间复杂度为O(N2),平均时间复杂度也为O(N2),效率较低。
主要优势:
- 稳定;
- 不占用额外内存;
- 便于处理数组或链表存储的待排序数据。
C语言描述:
#include<stdio.h>
typedef int ElementType;
void Swap(ElementType *A, ElementType *B) {
ElementType temp = *A;
*A = *B;
*B = temp;
}
/* 冒泡排序C语言描述 */
void Bubble_Sort(ElementType Data[], int N) {
int P, i, flag;
for (P = N - 1; P >= 0; P--) {
flag = 0;
for (i = 0; i < P; i++) { /*一趟冒泡*/
if (Data[i] > Data[i + 1]) { /*大于号保证稳定性*/
Swap(Data[i], Data[i + 1]);
flag = 1; /*发生了交换*/
}
}
if (flag == 0) break; /*全程无交换*/
}
}
int main() {
int i;
ElementType Data[] = {19, 3, 10, 20, 22, 28, 33, 23, 15, 30};
Bubble_Sort(Data, 10);
return 0;
}
附:时间复杂度下界
- 对于下标i<j,如果A[i]>A[j],则称(i,j)是一对逆序对(inversion);
- 交换两个相邻元素正好消去一个逆序对,插入排序T(N,I)=O(N+I);
- 定理:任意N个不同元素组成的序列平均具有N(N-1)/4个逆序对;
- 定理:任何仅以交换相邻两元素来排序的算法,其平均时间复杂度为Ω(N2)。
410

被折叠的 条评论
为什么被折叠?



