冒泡排序
不知道怎么了,今天拿起关于冒泡排序的知识,但是突然忘记了。基础没搞好,真丢人,赶紧想,算,还用excel分步写一些东西整理思路,但好像怎么也想不起来了。
看了很多文章,才回忆起来。
某篇文章中的视频很不错,可以看一下:
http://www.tudou.com/v/htKY1-Rj9ZE
看完两个视频,才真正理解某些知识库中关于冒泡排序的思路。就是从数组中第一个元素开始与后一个元素比较,将元素数值较大的放在后一个位置。第一个元素和第二个元素比较,看是否交换;然后,第二个元素和第三个元素比较,看是否交换;然后,第三个元素和第四和比较,看是否交换;以此类推。
第一轮两两比较,需要(数组总个数 - 1)那么多次;
第二轮两两比较,由于最大的已经沉到了最后,需要比较的次数比上一次少了一次;
...
直至不需要比较。
共计需要的轮数与第一轮次数相等。
最后就在大脑中建立了冒泡排序的基本模型,然后用代码去实现它。
附上一段经过艰苦回忆才想起来的Java代码。
1 import java.util.Arrays; 2 public class ClassT { 3 public static void main(String[] args) { 4 int[] a = {7,4,2,5,1}; 5 System.out.println(a.length); 6 for (int outer = a.length - 1; outer > 0; outer--) { 7 for (int inner = 0 ; inner < outer; inner++) { 8 if (a[inner] > a[inner+1]) { 9 int tmp = a[inner+1]; 10 a[inner+1] = a[inner]; 11 a[inner] = tmp; 12 } 13 } 14 } 15 System.out.println(Arrays.toString(a)); 16 } 17 }
主要难点在两个for 循环,内外循环控制好比较的轮数和次数。
第一个循环控制比较的次数。通过我们在大脑中建立的模型,可以用外循环控制轮数,内循环控制比较的次数。
外循环控制轮数,越比较越少,共需要(a.length - 1)轮;内循环需要想一番,需要控制次数,同时还要被下标使用。所以inner初始值用0,而比较的次数正好与轮数相同,所以终止值用outer,步长为 1 。
然后像舞蹈视频中一样,每轮都从下标为0的数组开始比较相邻的两个元素,直至最后一轮。
这么简单一个算法,居然忘记了。让大家见笑了。