九大排序之——冒泡排序
来源:互联网 发布:网络东北大秧歌曲大全 编辑:程序博客网 时间:2024/06/05 11:13
冒泡排序——原意是说鱼从水底下吐泡泡,然后一直漂浮到水面上的过程,冒泡排序就是不断的将一个元素不断的与后面的元素进行比较,如果大于(升序)就叫交换两个元素的位置,直到比较到末尾元素为止,在将其余元素进行相同的操作,知道所有的元素都排到最终的位置,排序完成。
图示举例(单趟冒泡过程):
冒泡排序过程:
算法步骤:
(1)比较相邻元素,如果第一个比第二个大就交换;
(2)对每一个相邻的元素进行同样的工作,从开始直到最后一对,通过比较最大的数据会跑到本次的最后位置;
(3)针对所有的元素进行同样的操作;
(4)直到没有任何一对数字需要比较时排序结束。
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:稳定
代码实现:
template<class T>void BubbleSort(T* arr, size_t n){ assert(arr);for (size_t i = 0; i < n; ++i){for (size_t j = 0; j < n - i - 1; j++){if (arr[j]>arr[j+1]){swap(arr[j], arr[j+1]);}}}}template<class T>void Print(T* arr, size_t n){for (int i = 0; i < n; i++){cout << arr[i] << " ";}cout << endl;}void TestBubbleSort(){int arr[] = { 1, 3, 4, 5, 6, 7, 2, 9, 8 };BubbleSort<int>(arr, sizeof(arr) / sizeof(arr[0]));Print<int>(arr, sizeof(arr) / sizeof(arr[0]));}
代码运行结果:
冒泡排序优化
方法:对于上面的排序方法,内排序中不管如何我们都需要将本次比较的末尾,如果我们能够判断arr[j]<arr[j+1],就可以结束本次比较,直接进入外层循环,比较下一次要比较的元素,这样就可以减让不需要的内层排序消耗,达到提升效率的目的;
代码实现:
template<class T>void Print(T* arr, size_t n){for (int i = 0; i < n; i++){cout << arr[i] << " ";}cout << endl;}template<class T>void BubbleSort(T* arr, size_t n)//优化{assert(arr);int flag = 0;for (size_t i = 0; i < n; ++i){flag = 0;for (size_t j = 0; j < n - i - 1; j++){if (arr[j]>arr[j + 1]){swap(arr[j], arr[j + 1]);flag = 1;}}if (flag == 0)break;}}void TestBubbleSort(){int arr[] = { 1, 3, 4, 5, 6, 7, 2, 9, 8 };BubbleSort<int>(arr, sizeof(arr) / sizeof(arr[0]));Print<int>(arr, sizeof(arr) / sizeof(arr[0]));}
运行结果:
阅读全文
0 0
- 九大排序之——冒泡排序
- 九大排序之——基数排序
- 三大基础排序之——冒泡排序
- 九大排序之——希尔排序
- 九大排序之——堆排序
- 九大排序之——选择排序
- 九大排序之——插入排序
- 九大排序之——快速排序
- 九大排序之——归并排序
- 九大排序之——计数排序
- 算法——排序之冒泡排序
- 排序算法之——冒泡排序
- 排序算法之——冒泡排序
- 排序之——冒泡排序
- 排序算法之—冒泡排序
- 算法之—冒泡排序
- 十大排序算法之(二)——冒泡排序
- 排序算法之交换排序——冒泡排序
- TEMP_FAILURE_RETRY宏
- hexo 创建个人博客
- log4j 初遇
- 单链表
- Elasticsearch自定义脚本完成性能测试
- 九大排序之——冒泡排序
- Dom4j的使用(全而好的文章)
- 从add函数分析函数栈帧的创建和销毁
- Logistic Regression是凸优化问题吗?
- 1 10 100 1000
- 我的第一个博客
- 最近看到的几款好用的框架
- 傅里叶级数与复的傅里叶级数、傅里叶变换
- 实验四 网络模拟器RouterSim的使用