排序——冒泡排序(C++)
来源:互联网 发布:koala mac版下载 编辑:程序博客网 时间:2024/05/29 07:10
1、算法描述:
设存在序列array[0. . n-1];- 选择 array[0] 元素作为基准元素,和array[1]元素作比较,当array[0] > array[1]成立时,则把array[0]和array[1]交换;不成立时,不交换;
- 再把array[1] 和 array[2]进行比较,当array[1] > array[2]成立时,则把array[1]和array[2]交换,依次类推;
- 当第一轮比较结束后,数组中最大的元素被交换到array[n-1]位置;
- 重复(1)和(2),当第二轮结束时候,数组中第二大元素被交换到array[-1-1]位置处;
- 当第n-2轮结束后,即排序完成。
在第 i 趟排序时(i = 1, 2, 3, . . . n-1),将array[0]和array[1比较大小,如果 array[0] > array[1], 则交换 array[0] 和array[1],否则不交换;然后再将array[1]和array[2]比较大小,如果array[1] > array[2]成立,则交换array[1]和array[2], 否则不交换;如此类推。
每一次比较array[n-i-1] 和 array[n-i],这样每一趟排序结束后都会有前面的未排序序列中最大的元素排在下标为 n-i 的array序列中,直到某一趟排序过程中不出现元素的交换动作,排序结束。
为了进一步改进算法,提升效率,可以设置一个标志位flag,用于判断每次比较后有没有进行交换,若没有进行交换,则表示排序已经完成:假设:
- flag = 0:表示该趟排序过程中有交换数据;
- flag = 1:表示该趟排序过程中没有交换数据
排序开始时,先设置flag=1;每趟排序过程中,若出现交换数据,则把flag置为0,如果在排序过程中没有交换动作,则flag不做处理;每趟比较、交换结束后,判断flag是否为1,若为1表示没有交换数据,数组是已经排好序的;如果flag为0,则表示数据有交换,则需要进行下一次循环。前边可以看出插入排序和选择排序都需要执行n-1趟排序,而对于设置了flag标志的冒泡排序而言,最多才需要执行n-1趟排序。
2、时间复杂度
- 最好情况(初始序列已经按升序):则只需要进行一趟n-1次元素之间的比较,并且不移动元素,算法时间复杂度为O(n);
- 最坏情况(初始序列逆序有序或者最小元素在序列的最后):需要进行n-1趟排序,总共进行 1 + 2 + 3 + 4 + . . . + n-1 = n(n-1) /2,时间复杂度为O(n^2);
代码示例:
#include <iostream> using namespace std;int bubbleSort(int array[], int n){int i, j, temp;int flag = 1;for (i = 0; i < n; i++){for (j = 0; j < n - 1 - i; j++){if (array[j]>array[j+1]){temp = array[j+1];array[j+1] = array[j];array[j] = temp;flag = 0;}}if (flag == 1)return 0;}return 0;}int main(){int array[] = {3, 54, 31, 11, 78, 1,34,32,76,7 };int size = sizeof(array) / sizeof(int);cout << "原始的数组:";for (int i = 0; i < size; ++i)cout << array[i] << " ";cout << "\n";bubbleSort(array, size);cout << "排序后数组:";for (int i = 0; i < size; ++i)cout<<array[i]<<" ";cout << "\n";system("pause");return 0;}
运行结果:
0 0
- 排序——冒泡排序(C++)
- C#——冒泡排序
- C语言排序(一)——冒泡排序
- 冒泡排序(C#)
- 冒泡排序(C++)
- 冒泡排序(C++)
- C——冒泡排序、快速排序,选择排序
- (四)简单排序—冒泡排序
- C语言——冒泡排序
- 冒泡排序——C语言
- C学习笔记——冒泡排序
- 冒泡排序—C—Python
- 排序——冒泡排序
- 排序——冒泡排序
- 排序——冒泡排序
- 排序——冒泡排序
- 排序——冒泡排序
- 排序——冒泡排序
- OpenCV实践之路——Python的安装和使用
- 最大子序列问题
- Dagger 笔记 一
- AFN
- 输入/输出(一)——编码,文件类,随机读写文件类
- 排序——冒泡排序(C++)
- android 中 checkBox 的使用
- 第四周项目 递归画图
- mysql 主从复制 主主配置
- 详细理解context(context访问资源的唯一性分析)
- MySQL 查看约束,添加约束,删除约束 添加列,修改列,删除列
- Problem F: 删出多余的空格
- FTP协议学习总结
- 《C++ Primer Plus》——编程练习答案(7)