冒泡排序
冒泡排序原理: 用第1个数对比第2个数,判断如果第一个数大于第二数,则把第一个数与第二个数交换位置,否则保持不变。然后再一轮判断第2个数与第3个数,如果第二数大于第三个数则把他们交换位置,否则保持不变。依次类推到最后一个数。折腾的第一次将把最大的数排到了最后去,折腾第二次则把第二大的数排到了最大数的前面。如果一共只有3个数,那么折腾2回就排序好了。
我想之所以叫冒泡排序,就是像水底往水面上冒泡一样,最上面的泡泡是最大的,然后越往下的泡泡就越小,就行这个程序一样,这些数字都是气泡,把大的冒到最上面去。最后穿成一串气泡,冒泡。我觉得叫土话叫做前后多次对比排序好理解。
例子:
public class Tmp { public static void bubbleSort(int[] array) { //冒泡排序开始 for(int i = 0; i <= array.length - 2; i++) //① { for(int j = 0; j <= array.length -i - 1; j++) //② { if(j + 1 <= array.length - 1 && array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } //冒泡排序结束 //输出每次排序的结果 System.out.println("di" + (i + 1) + "sort"); for(int k = 0; k < array.length; k++) { System.out.print(array[k] + " "); } System.out.println("\n"); } } public static void main(String[] args) { int[] array = {4, 7, 8, 9, 3, 2}; bubbleSort(array); } }
程序解析:
1、上面有2个循环,必须的。
2、上面① 处的作用确定对比的次数(循环的次数),共有6个数,所以需要循环5次就能排序好了。array.length - 2 就是 4,因为第一次是从0算起的,所以0-4共5次。
3、② 处的for(int j = 0; j <= array.length -i - 1; j++) ,其实-i 这一条语句可以不写,也一样前后对比一遍,因为 第一次的对比的出最大的结果,第二次得到第二大的结果...依次类推,所以这里-i 就是循环一次减去最后面的一个数 ,因为它是最大的已经确定的,就不用再去对比了,这样也是优化程序。-1就更不用说了,因为0-5是6个数。如果0-6就 7了,就错了,一共只有6个数。
4、if(j + 1 <= array.length - 1 && array[j] > array[j + 1]) ,最前面判断,j + 1 最大为5,也就是第6个数。如果 不判断的话,当j = 5的时候,后面会执行 array[j + 1],这时候数组下标就变成了6(表7个数),就超出数组长度了 。
---------------------------------------
·上面的“冒泡排序”很容易看懂,但是存在性能问题。下面小小的优化一下,比上面难看懂,但性能更好。
public class BubbleSortTest { public static void bubbleSort(int[] array) { for(int i = 0; i < array.length - 1; i++) //① { for(int j = 0; j < array.length - i - 1; j++) //② { if(array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } System.out.println("第" + (i + 1) + "趟排序"); for(int k = 0; k < array.length; k++) { System.out.print(array[k] + " "); } System.out.println("\n"); } } public static void main(String[] args) { //int[] array = {4, 7, 8, 9, 3, 2}; int[] array = {6, 5, 4, 3, 2, 1}; bubbleSort(array); } }
解析程序:
1、第① 处程序 for(int i = 0; i < array.length - 1; i++) ,判断i小于5,那么只能是4,与上面程序一样。
2、比上面更精简,并且下面的if判断,也用再加最大值为5的限制条件了。并且程序性能更优了。if(array[j] > array[j + 1]) 因为array[j +1] 当前面的j=4的时候,这里的array数组下标要+1,所以就是5了,5代表6个数。总结:6个数的对比,只用5次。
补充:软件开发 , C++ ,