当前位置:网站首页>冒泡排序的时间复杂度分析
冒泡排序的时间复杂度分析
2022-07-26 13:16:00 【weixin_43766298】

1. 未优化的冒泡排序
- 内循环:因为数组下标涉及到 i+1,那么最大值为 length-2,另外每完成一次外循环,数组待处理的元素就会减少一个,因此内循环的最大值是:length -1- k
/** * 比较次数分析: * int[] 有元素 n个 * i = 0 --> 总共有n个待处理元素 共比较n-1次 * i = 1 --> 总共有n-1个待处理元素 共比较n-2次 * i = 2 --> 总共有n-2个待处理元素 共比较n-3次 * ...... * i = n-3 --> 总共有3个待处理元素 共比较2次 * i = n-2 --> 总共有2个待处理元素 共比较1次 * * 将上面的比较次数相加得到 总比较次数: * (n-1)+(n-2)+(n-3)+ ... +3+2+1 = (1+(n-1))*(n-1)/2 = n*(n-1)/2 = (n^2 -n)/2 */
public static void mppx(int[] oldArr){
if (oldArr.length > 1){
for (int k = 0; k < oldArr.length; k++) {
// 外循环
for (int i = 0; i < oldArr.length -1-k; i++) {
// 内循环
if (oldArr[i]>oldArr[i+1]){
int max = oldArr[i];
oldArr[i] = oldArr[i+1];
oldArr[i+1] = max;
}
}
}
}
}
2. 优化后的冒泡排序
- 外循环优化:n个元素 实际只需要完成n-1大轮
- 如果第一次大轮(外循环)下来,如果没有发生交换,那么数组中的元素本来就是有序的,所以可以对算法进行优化
public static void mppx(int[] oldArr){
if (oldArr.length > 1){
int k,i,max,
flag=1,// 用于 本来就是有序数组的判断flag:如果第一轮外循环下来还没有发生元素交换,那就证明该数组是有序的
//moveCount = 0,// 记录交换次数的
len = oldArr.length ;
for ( k = 0; k < len-1; k++) {
// 外循环:循环数组中每一个元素,n个元素 实际只需要完成n-1轮
for ( i = 0; i < len-1-k; i++) {
// 内循环: 用于和其它元素进行比较和交换
if (oldArr[i] > oldArr[i+1]){
max = oldArr[i];
oldArr[i] = oldArr[i+1];
oldArr[i+1] = max;
flag = 0;
moveCount++;
}
}
// 第一大轮下来,如果没有发生交换,数组中元素就是有序的
if (flag==1){
//System.out.println("k = " + k + ":数组中元素就是有序");
break;
}
}
//System.out.println("moveCount = " + moveCount);
}
}
3. 最佳情况分析(数组中的元素本来就是有序的)
- 冒泡排序算法采用优化后(关键的flag)
| 数组 | 比较和移动次数 |
|---|---|
| 123 | 比较2次 交换0次 |
| 1234 | 比较3次 交换0次 |
| 12345 | 比较4次 交换0次 |
| 123456 | 比较5次 交换0次 |
| … | … |
| n个有序元素 | 比较n-1次 交换0次 |
- 因此 冒泡排序的 最佳时间复杂度为: O(n)
4. 最差情况分析(数组中的元素是完全逆序的)
- 假设数组2个元素值互换的过程为一次操作
| 原数组 + 移动过程 | 比较和交换次数 |
|---|---|
| 21: 12 | 2个元素 == 比较1次 交换1次 |
| 321: 231->213->123 | 3个元素 == 比较(1+2)次 交换(1+2)次 |
| 4321: 3421->3241->3214->2314->2134->1234 | 4个元素 == 比较(1+2+3)次 交换(1+2+3)次 |
| 54321: 45321->43521->43251->43215->34215->32415->32145->23145->21345->12345 | 5个元素 == 比较(1+2+3+4)次 交换(1+2+3+4)次 |
| 654321: | 6个元素 == 比较(1+2+3+4+5)次 交换(1+2+3+4+5)次 |
| … | … |
| n个倒序元素 | n个元素 == 比较(1+2+3+4+5+…+ n-1)次 交换(1+2+3+4+5+…+ n-1)次 |
| n个倒序元素 | n个元素 == 比较(n-1)*n/2次 交换(n-1)*n/2次 |
- 因此 冒泡排序的 最差时间复杂度是:(n-1)*n/2 + (n-1)*n/2 = n^2 -n 忽略低次幂得到 O(n^2)
5. 冒泡排序算法的稳定性
- 如果两个相邻元素相等,并不会发生交换操作,所以冒泡不会改变相同元素的下标,因此冒泡排序是一个稳定的排序算法。
边栏推荐
- Precautions for triggering pytest.main() from other files
- Target detection network r-cnn series
- Student examination system based on C #
- B+树挑选索引(1)---mysql从入门到精通(二十二)
- 终极套娃 2.0 | 云原生交付的封装
- 基于C#开放式TCP通信建立与西门子PLC的socket通信示例
- B+树索引使用(6)最左原则 --mysql从入门到精通(十八)
- vector的一些实用操作
- Flutter integrated Aurora push
- 12 brand management of commodity system in gulimall background management
猜你喜欢

Slam 02. overall framework

基于BERT的情感分析模型

基于C#实现的学生考试系统

8 年产品经验,我总结了这些持续高效研发实践经验 · 研发篇
![[upper computer tutorial] Application of integrated stepping motor and Delta PLC (as228t) under CANopen communication](/img/d4/c677de31f73a0e0a4b8b10b91e984a.png)
[upper computer tutorial] Application of integrated stepping motor and Delta PLC (as228t) under CANopen communication

3D modeling and rendering based on B é zier curve

学习pinia 介绍-State-Getters-Actions-Plugins

postgresql官网下载出错

Huawei recruited "talented teenagers" twice this year; 5.4 million twitter account information was leaked, with a selling price of $30000; Google fired engineers who believed in AI consciousness | gee

我们被一个 kong 的性能 bug 折腾了一个通宵
随机推荐
[applet] why can't the onreachbottom event be triggered? (one second)
Can MySQL customize variable parameter storage functions?
Sword finger offer (x): rectangular coverage
【花雕动手做】有趣好玩的音乐可视化系列小项目(12)---米管快速节奏灯
Extra (5) - MySQL execution plan (51)
B+树索引使用(8)排序使用及其注意事项(二十)
SLAM 02.整体框架
Example of establishing socket communication with Siemens PLC based on C # open TCP communication
Extra(5)—mysql执行计划(五十一)
基于C#实现的学生考试系统
基于Locust框架进行文件上传下载性能测试
Version of NDK matched the requested version 21.0.6113669. versions available locally: 2
8 年产品经验,我总结了这些持续高效研发实践经验 · 研发篇
Use positioning to realize left, middle and right layout, and the middle content is adaptive
概率论与数理统计
如何构建以客户为中心的产品蓝图:来自首席技术官的建议
Use grid to realize left, middle and right layout, and the middle content is adaptive
B+ tree selection index (1) -- MySQL from entry to proficiency (22)
key&key_len&ref&filtered(4)—mysql执行计划(五十)
One stroke problem (Chinese postman problem)