基于比较的算法之一:冒泡排序
2014-04-23 20:58
134 查看
冒泡排序是基于比较的排序中比较基本的算法。
以升序排序目的为例,算法的中心思想是从头至尾的比较两两相邻的元素,如果发现有反序(决定了稳定性)的则交换两个相邻元素。完成第一趟比较后最大的元素放到了最末端。
第二趟从头至尾的比较不用比较最后一个元素(最大元素已经在最末端正确位置),所以比第一次少比较了一个元素,这趟比较完成后,第二个元素到达正确位置。
持续进行这样的操作,直到只剩下最后一个最小元素被放到了第一个位置,排序完成。
假设n个元素排序:
1.最好时间复杂度 O(n),比较次数C=n,即所有数据都已经按照小-〉大的顺序排好,只需要做n次比较,M=0次移动
但是此种情况需要有一个记录数据是否移动的变量
2.最差的时间复杂度为O(n2),即所有数据是原始反序的,则第i次扫描数据时的比较次数是Ci=n-i,i=0,1,2...(n-1),数据移动次数是Mi=3Ci
所以比较次数总数Cmax=n(n-1)/2
移动次数总数Mmax=3Cmax=3n(n-1)/2
总次数为Cmax+Mmax=2n(n-1)
所以冒泡排序最坏的时间复杂度是O(n2)
综上,因此冒泡排序总的平均时间复杂度为O(n2)。
下面给出C#的通用冒泡排序算法:
作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。
/article/5796325.html
以升序排序目的为例,算法的中心思想是从头至尾的比较两两相邻的元素,如果发现有反序(决定了稳定性)的则交换两个相邻元素。完成第一趟比较后最大的元素放到了最末端。
第二趟从头至尾的比较不用比较最后一个元素(最大元素已经在最末端正确位置),所以比第一次少比较了一个元素,这趟比较完成后,第二个元素到达正确位置。
持续进行这样的操作,直到只剩下最后一个最小元素被放到了第一个位置,排序完成。
假设n个元素排序:
1.最好时间复杂度 O(n),比较次数C=n,即所有数据都已经按照小-〉大的顺序排好,只需要做n次比较,M=0次移动
但是此种情况需要有一个记录数据是否移动的变量
2.最差的时间复杂度为O(n2),即所有数据是原始反序的,则第i次扫描数据时的比较次数是Ci=n-i,i=0,1,2...(n-1),数据移动次数是Mi=3Ci
所以比较次数总数Cmax=n(n-1)/2
移动次数总数Mmax=3Cmax=3n(n-1)/2
总次数为Cmax+Mmax=2n(n-1)
所以冒泡排序最坏的时间复杂度是O(n2)
综上,因此冒泡排序总的平均时间复杂度为O(n2)。
下面给出C#的通用冒泡排序算法:
startIndex为排序区间的数组元素下标,通常为0,
endIndex为排序区间的数组元素下标,通常为array.Length-1
public class BubbleSort<T> where T : IComparable<T> { public void Sort(T[] array, int startIndex, int endIndex) { bool isMoved = false; for (int i = endIndex; i >= startIndex; i--) { for (int j = startIndex; j < i; j++) { if (array[j].CompareTo(array[j + 1]) > 0) { T v = array[j + 1]; array[j + 1] = array[j]; array[j] = v; isMoved = true; } } if (isMoved == false) break; } } }
作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。
/article/5796325.html
相关文章推荐
- 基于图像形状的一种比较漂亮的分类算法
- c语言中冒泡排序、插入排序、选择排序算法比较
- c语言中冒泡排序、插入排序、选择排序算法比较
- 基于可编程图形处理器的骨骼动画算法及其比较
- 【更新】排序算法比较:插入排序,冒泡排序,归并排序,堆排序,快速排序,计数排序,基数排序,桶排序
- 算法学习小心得——基于比较的排序算法汇总
- 推荐算法:基于svd的算法:比较
- 算法 基于比较的排序
- 基于比较的算法之二:选择排序
- 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
- 推荐系统系列---基于movielens数据集的KNN算法与矩阵分解算法比较
- 基于比较的算法之三:插入排序
- 算法:基于比较的排序算法
- 基于比较的算法之五:堆排序
- iOS开发--图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序
- 基于图像形状的一种比较漂亮的分类算法
- 基于图像形状的一种比较漂亮的分类算法
- c语言中冒泡排序、插入排序、选择排序算法比较
- LCD圆弧绘制算法~基于逐点比较算法,入口参数:弧线起点、终点(逆时针方向)、圆心
- 深度学习:基于梯度下降不同优化算法的比较总结