冒泡排序


前言

冒泡排序是一个经典的算法。不管是学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循环,通过每一轮循环,确定一个较大值(或较小值),放在数组的右边。关键在于确定外层循环(轮次)以及内层循环(每一轮的比较次数),找到内外层循环之间的关系。最后就是元素的比较大小以及交换元素位置(可以理解为交换两个变量的值)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
冒泡排序-排序过程 设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。 算法示例 49 13 13 13 13 13 13 13 38 49 27 27 27 27 27 27 65 38 49 38 38 38 38 38 97 65 38 49 49 49 49 49 76 97 65 49 49 49 49 49 13 76 97 65 65 65 65 65 27 27 76 97 76 76 76 76 49 49 49 76 97 97 97 97 Procedure BubbleSort(Var R : FileType) //从下往上扫描的起泡排序// Begin For I := 1 To N-1 Do //做N-1趟排序// begin NoSwap := True; //置未排序的标志// For J := N - 1 DownTo 1 Do //从底部往上扫描// begin If R[J+1]< R[J] Then //交换元素// begin Temp := R[J+1]; R[J+1 := R[J]; R[J] := Temp; NoSwap := False end; end; If NoSwap Then Return//本趟排序中未发生交换,则终止算法// end End; //BubbleSort// 该算法的时间复杂性为O(n2),算法为稳定的排序方 冒泡排序-冒泡排序法的改进 比如用冒泡排序将4、5、7、1、2、3这6个数排序。在该列中,第二趟排序结束后,数组已排好序,但计算机此时并不知道已经反排好序,计算机还需要进行一趟比较,如果这一趟比较,未发生任何数据交换,则知道已排序好,可以不再进行比较了。因而第三趟比较还需要进行,但第四、五趟比较则是不必要的。为此,我们可以考虑程序的优化。 为了标志在比较中是否进行了,设一个布尔量flag。在进行每趟比较前将flag置成true。如果在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,如果它仍为true(表明在该趟比较中未发生一次数据交换)则结束排序,否则进行下一趟比较。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值