冒泡排序法过程及代码
-
待排序数组:{5, 4, 7, 1, 6, 2},升序排序
---------------------------------------
第一次循环:
第一次比较5和4,5>4,交换位置:{4,5,7,1,6,2}
第二次比较5和7,5
第三次比较7和1,7>1,交换位置:{4,5,1,7,6,2}
第四次比较7和6,7>6,交换位置:{4,5,1,6,7,2}
第五次比较7和2,7>2,交换位置:{4,5,1,6,2,7}
第一次循环完成结果:{4,5,1,6,2,7}
----------------------------------------
第二次循环:
第一次比较4和5,4
第二次比较5和1,5>1,交换位置:{4,1,5,6,2,7}
第三次比较5和6,5
第四次比较6和2,6>2,交换位置:{4,1,5,2,6,7}
第五次比较6和7,6
第二次循环完成结果:{4,1,5,2,6,7}
----------------------------------------
第三次循环:
第一次比较4和1,4>1,交换位置:{1,4,5,2,6,7}
第二次比较4和5,4
第三次比较5和2,5>2,交换位置:{1,4,2,5,6,7}
第四次比较5和6,5
第五次比较6和7,6
第三次循环完成结果:{1,4,2,5,6,7}
----------------------------------------
第四次循环:
第一次比较1和4,1
第二次比较4和2,4>2,交换位置:{1,2,4,5,6,7}
第三次比较4和5,4
第四次比较5和6,5
第五次比较6和7,6
第三次循环完成结果:{1,2,4,5,6,7}
----------------------------------------
第五次循环:
第一次比较1和2,1
第二次比较2和4,2
第三次比较4和5,4
第四次比较5和6,5
第五次比较6和7,6
第三次循环完成结果:{1,2,4,5,6,7}
相信看完上面的演示过程,你对冒泡排序过程及原理有了完全的理解,但是细心的朋友应该会发现其实在第四次循环就已经得到了最终的结果,这么来看第五次循环完全是多余的,于是就有冒泡排序的改进版本:当某一轮循环当中没有交换位置的操作,说明已经排好序了,就没必要再循环了,break退出循环即可。
复杂度分析:
时间复杂度:若给定的数组刚好是排好序的数组,采用改进后的冒泡排序算法,只需循环一次就行了,此时是最优时间复杂度:O(n),若给定的是倒序,此时是最差时间复杂度:O(n^2) ,因此综合平均时间复杂度为:O(n^2)
空间复杂度:因为每次只需开辟一个temp的空间,因此空间复杂度是:O(1);
-
冒泡代码
for(int i=0;i<length()-1;i++){ for(int j=0;j<length()-i-1;j++){ if(y[j]>y[j+1]){ int temp=y[j]; y[j]=y[j+1]; y[j+1]=temp; } } }