冒泡排序,从名字上解读,我们来观想一个画面,就是泡泡从水底慢慢冒上来的画面,呵呵,我是很喜欢看漫画片的,想想以前看的动漫里面,鱼儿吐的泡泡是怎么样子的呀,从下往上的,而这个过程中,我们可以解读到一个点,就是从下往上的过称,每一步拆分开来就是每一次泡泡前进一步,就是当前位置到后面的一个位置,而动漫中泡泡会怎么样呀,往上的时候泡泡是慢慢变大的,放在这里就是数据和后一个数据比较,然后将大的值移动到后面(当然这里不一定一定要把大的值放在后面,也可以把小的值放在后面,具体看我们需要的是什么,这里这样说明,是为了更加方便解读以及理解)。当大的泡泡出来了,那么跳过这个泡泡代表的值,我们开始重新选出最大的泡泡,直到吐不出泡泡为止(要筛选的数组变空)。
网络中很多的冒泡排序都是for循环嵌套实现的,很多,我今天在写的时候再想,这个如果不用for循环嵌套可以不可以,然后就实现了下面的递归类型的冒泡,在此提供出来与大家分享,如果有不妥的地方,请看了的朋友多多指点才好。
1 package 算法.排序; 2 3 /** 4 * 冒泡排序 5 * @author Administrator 6 * 7 */ 8 public class BubbleSort { 9 public int[] waitSortArr; 10 11 public static void main(String[] args) { 12 BubbleSort bsort = new BubbleSort(); 13 bsort.waitSortArr = new int[] {10,5,8,1,3,17,11,11,-5,6}; 14 // 执行排序 15 bsort.sortCode(0, bsort.waitSortArr.length); 16 // 打印排序后的结果 17 bsort.printArr(); 18 } 19 20 /** 21 * 核心排序算法 22 * @param nowPs 当前位置 23 * @param scannerArrLength 扫描集合长度 24 */ 25 public void sortCode(int nowPs, int scannerArrLength) { 26 if (scannerArrLength == 0) { 27 return; 28 } 29 if (nowPs + 1 < scannerArrLength) { 30 adjacentCompare(nowPs); 31 sortCode(nowPs + 1, scannerArrLength); 32 } else { 33 sortCode(0, scannerArrLength - 1); 34 } 35 } 36 37 public void printArr() { 38 for (int i=0;i<this.waitSortArr.length;i++) { 39 System.out.print(this.waitSortArr[i]); 40 if (i != this.waitSortArr.length - 1) { 41 System.out.print(" "); 42 } 43 } 44 } 45 46 /** 47 * 相邻比较 48 */ 49 private void adjacentCompare(int nowPs) { 50 if (this.waitSortArr[nowPs] > this.waitSortArr[nowPs+1]) { 51 int tempValue = this.waitSortArr[nowPs]; 52 this.waitSortArr[nowPs] = this.waitSortArr[nowPs+1]; 53 this.waitSortArr[nowPs+1] = tempValue; 54 } 55 } 56 }