冒泡排序(Bubble Sort)
2017-08-16 17:09
155 查看
基本思想: 一种简单的排序算法,其重复地走访待排序数列,依次比较两个相邻元素,如果逆序则交换,直到没有反序的记录为止;可以保证每访问一趟后,最大值位于最后面。冒泡排序的动态图示如下所示:
复杂度分析:最坏时间复杂度为O(N2),平均时间复杂度也为O(N2),效率较低。
主要优势:
稳定;
不占用额外内存;
便于处理数组或链表存储的待排序数据。
C语言描述:
附:时间复杂度下界
对于下标i<j,如果A[i]>A[j],则称(i,j)是一对逆序对(inversion);
交换两个相邻元素正好消去一个逆序对,插入排序T(N,I)=O(N+I);
定理:任意N个不同元素组成的序列平均具有N(N-1)/4个逆序对;
定理:任何仅以交换相邻两元素来排序的算法,其平均时间复杂度为Ω(N2)。
复杂度分析:最坏时间复杂度为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)。
相关文章推荐
- 交换排序—冒泡排序(Bubble Sort)
- Java中的经典算法之冒泡排序(Bubble Sort)
- 冒泡排序(Bubble Sort)
- PHP实现排序算法----冒泡排序(Bubble Sort)
- 算法:冒泡排序(Bubble Sort)、插入排序(Insertion Sort)和选择排序(Selection Sort)总结
- 冒泡排序 Bubble Sort
- C语言练习0之数组——数组元素求和与数组冒泡排序(bubble sort)
- 冒泡排序(Bubble Sort)
- 交换排序—冒泡排序(Bubble Sort)算法原理以及Java实现
- 冒泡排序(Bubble Sort)
- 冒泡排序(Bubble sort)
- 冒泡排序 - Bubble Sort
- 也谈冒泡排序(bubble sort)---两次‘优化’
- Bubble Sort 冒泡排序
- 冒泡排序(Bubble Sort)
- Bubble sort(冒泡排序)
- golang 冒泡排序(bubble sort)
- 数据结构基础(8)------------冒泡排序(Bubble Sort)
- 【DS】排序算法之冒泡排序(Bubble Sort)