前言
冒泡排序是一个经典的算法。不管是学C语言还是Java语言或是其他的语言,都要经历冒泡排序这一过程。本篇我将根据我的个人理解来介绍冒泡排序。
1.冒泡排序
要理解冒泡排序。我们就要理解什么是“冒泡”。所谓的冒泡,就是像鱼在水里吐泡泡一样,小的泡泡在下面,大的泡泡浮起来在上面。如下图所示:
冒泡排序的结果与此类似。所以,冒泡排序的过程可以理解为:
将数组中的相邻两个元素进行比较,将较大(较小)的数通过两两比较移动到数组末尾(开始),执行一遍内层循环,确定一个最大(最小)的数,外层循环从数组末尾(开始)遍历到开始(末尾).
算法简介:
1.比较相邻的元素,前一个比后一个大(或者前一个比后一个小)调换位置
2.每一对相邻的元素进行重复的工作,从开始对一直到结尾对,这步完成后,结尾为做大或最小的数.
3.针对除了最后一个元素重复进行上面的步骤。
4.重复1-3步骤直到完成排序
2.冒泡排序过程
过程分析图解:(这里声明一下,这个动图是我搜的一张动图,因为动画演示的过程更容易让人理解,但是我不会做动图。我可以用一张一张的图片来把过程说清楚,但是!图多了会让人看起来很烦!!!效果真的不如这个动图!!!)
按照鱼吐泡泡的那张图,我们的目标是,把这个数组中大的元素“浮起来”,即,把较大的元素从左边移放到右边。实现从左到右依次增大(从大到小的排序过程是一样的。)
1.通过第一轮的比较,我们把9这个值排在了最右边。比较了8次,数组的长度为9.即arr.length = 9;
2.通过第二轮的比较,我们把8这个值排在了从右往左数的第二个,因为9在最右边已经确定了最大,那么这一轮就只用比较7次。
3.通过第三轮的比较,我们把7这个值排在了从右往左数的第三个,因为8和9在右边的位置已经确定了,那么这一轮就只用比较6次。
这是前三轮的比较,后面几轮的比较也是如此。
我们把比较的轮次和该轮比较的次数做一个记录,可以得出以下的信息:
我们以轮次作为外层的循环变量记为:i
每轮的比较次数作为内层的循环变量,记为:j
那么就有这样的一个等式成立:i + j = arr.length;
当然,这是适用于任意一个的乱序int类型的数组。特殊情况下的数组可能不需要这样排,当然,特殊情况下的数组排序,你或许可以一眼看出来,但是计算机没那么智能啊。所以还是老老实实的一个一个进行比较吧!!!
对于内层循环变量与外层循环变量的确定应该是很好理解了吧,在这里,因为每一轮的比较完了,才会进行下一轮,所以比较的过程是在内层的循环,而每次比较完会把这一轮中的较大值放在右边,然后结束内层循环,外层循环的循环变量的值自增(+1),即进行下一轮的比较。
3.代码实现
代码如下(示例):
for (int i = 1; i <= arr.length-1; i++) {
for (int j = 0; j < arr.length-i; j++) {
if (arr[j]>arr[j+1]){
int t = arr[j]; //这里的t为临时变量,用于两个变量交换值,作为中间变量
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
总结
冒泡排序就是利用双重for循环,通过每一轮循环,确定一个较大值(或较小值),放在数组的右边。关键在于确定外层循环(轮次)以及内层循环(每一轮的比较次数),找到内外层循环之间的关系。最后就是元素的比较大小以及交换元素位置(可以理解为交换两个变量的值)。