博主我在上一篇博客中已经详细地讲解了关于冒泡排序算法的相关知识了,不过接下来的这篇博客将会进一步地阐述冒泡排序中需要注意的知识点,这一点我觉得相当重要,所以在此又开了进阶篇,那么接下来我们将会从 对比次数,交换次数,元素地址还有已经排好序的几个方面详细讲解。
首先我们先把算法给展示出来:如下
/** * 比较次数 交换次数 变量 (注意,已经排好序的情况) * * @param array */ private static void sort(int[] array){ int temp; //外层循环一次 都会产生一个最大数 for (int i = 0; i < array.length; i++) { //标识排序成功,true排好序,否则false boolean flag = true; //决定比较次数 for (int j = 0; j <array.length-1 ; j++) { //决定交换次数 if (array[j]>array[j+1]){ temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; flag = false; } } if (flag){ break; } System.out.print("第"+(i+1)+"论排序结果:"); display(array); } }
(1)比较次数 交换次数 如果你对算法比较了解的话你就会发现它的性能是跟这两个知识是有先关的,
而且他们是成反比的存在的,也就是说比较次数跟交换次数越少,它的性能越高,反之。而我在冒泡排序
里面讲解这两个知识点也是为日后再学习其他算法打下基础。上面的代码注释中标示在哪个环节中存在的。
(2)既然算法是用来做排序的,那么一个集合数据肯定存在不同的顺序结构,也就是说我们带一个集合或者说是
数组的数据进行排序的时候,有可能在不进行全部遍历的情况下就已经把排序给排好了,话句话说就是不用在继续往下
遍历了,因为外层每次遍历一次,至少冒泡排序法内层还需要进行N此遍历,这样子大大的提升了排序的性能,所以我们在代码当中加入了一个变量 flag来表示该集合或者数组是否拍好了序。