您的位置:首页 > 其它

冒泡排序(Bubble Sort)

2017-08-16 17:09 155 查看
基本思想: 一种简单的排序算法,其重复地走访待排序数列,依次比较两个相邻元素,如果逆序则交换,直到没有反序的记录为止;可以保证每访问一趟后,最大值位于最后面。冒泡排序的动态图示如下所示:

  

  


复杂度分析:最坏时间复杂度为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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: