冒泡排序:
据说是八大排序中的其一,通俗的意思就是讲,在一组数据中,相邻元素依次比较大小,最大的放后面,最小的冒上来
我这里简单画了一个图,不算流程,但里面有分析过程
1、确定第1个数的位置:依次与其它数据相比:
--第1次和2相比,比2大,则右移1位到2的位置上, 这时候,1在2位置上了
--再与3相比,如果比3大,再向右移1位到3的位置上,不大则不用移动,这时候1在3位置上
--再与4相比,如果比4大,再向右移动1位到4的位置上,不大则不用移动,这时候1在4位置上
--再与5相比,如果比5大,再向右移动1位到5的位置上,不大则不用移动,这时候1在5位置上
经过以上一轮4次的比较,我们可以确定1的位置。
下图是流程图:
2、确定第2个数的位置:依次与除1以外的其它数据相比(因为第1轮比较1的时候,已经比过了,已经确定了1的位置,所以这以后都没必要再跟1比了):
--第1次和3相比,比3大,则右移1位到3的位置上, 这时候,2在3位置上了,不大则不用移动
--再与4相比,如果比4大,再向右移1位到4的位置上,这时候2在4位置上,不大则不用移动
--再与5相比,如果比5大,再向右移动1位到5的位置上,这时候1在5位置上,不大则不用移动
经过以上一轮3次的比较,我们可以确定2的位置。
3、确定第3个数的位置:依次与除1、2以外的其它数据相比(因为第1轮、第2轮比较1、2的时候,已经比过了,已经确定了1、2的位置,所以这以后都没必要再跟1、2比了):
--第1次和4相比,比4大,则右移1位到4的位置上, 这时候,3在4位置上了,不大则不用移动
--再与5相比,如果比5大,再向右移1位到5的位置上,这时候2在5位置上,不大则不用移动
经过以上一轮2次的比较,我们可以确定3的位置。
4、确定第4个数的位置:依次与除1、2、3以外的其它数据相比(因为第1轮、第2轮、第3轮比较1、2、3的时候,已经比过了,已经确定了1、2、3的位置,所以这以后都没必要再跟1、2、3比了):
--第1次和5相比,比5大,则右移1位到5的位置上, 这时候,4在5位置上了,不大则不用移动
经过以上一轮1次的比较,我们可以确定4的位置。
5、最后的5不用再比较了,因为已经确定了其它剩下的位置,第一轮都有与5比较过,所以其它4个坑占了后,剩下的5你还有啥选择呢。已经被固定了
以上我只过第1轮的时候的图,让大家能了解一下站队的一个大体情况,近而来分析,那么接下来,我们来分析一下,如何用程序实现这个逻辑:
1、首先我们就定5个数吧,那么我们可以把这5个数放在一个数组里。int[] nums={23,12,34,2,67}或int[] nums=new int[]{23,12,34,2,67},这里怎么用:开心就好!
2、要进行4轮的比较才能确定,这一定是个循环,固定次数的,我们用for吧。for(int i=0;i<4;i++),当然你用for(int i=1;i<=4;i++)也行,不过数组是从0开始的,所以习惯i从0开始,这样也有利于看直接:数组[i],不然还每次得:数组[i-1]。4也就是:数组.length-1
3、每一轮里面要循环不同次数比较数据确定位置,那么在第2步循环中,要再有一个循环,这是多重循环,也叫潜逃循环
这个for循环,我们也要来分析一下,它的范围:
第几轮(我们定的是变量i) (内层循环)次 变量j
1 对应数组下标i是0 4 外层循环第1次,内层需要循环4次 =5-i-1
2 对应数组下标i是1 3 外层循环第2次,内层需要循环3次 =5-i-1
3 对应数组下标i是2 2 外层循环第3次,内层需要循环2次 =5-i-1
4 对应数组下标i是3 1 外层循环第4次,内层需要循环1次 =5-i-1
内层for循环,我们设置变量j,for(int j=0;j< ;j++),j<这个值,要找出来
双重循环的原理是:外层循环1次,内层循环1轮(遍历),上表已经很清晰的标示出了j每轮循环里面要执行的次数,但因为我们是i是从0开始的,所以j的范围应该是5-i-1,也就是:数组.length-1-i
4、在内层循环中还有一个条件,即前一位比后一位大的话,进行挪位,不大则不变位置,如果涉及挪位的时候,我们需要一个变量来倒腾一下交换要挪位的2个值。
通过以上分析:啊,恍然大悟~~~
package com.cn.u4; /** * @author Administrator 冒泡排序,升序 */ public class SortNum { public static void main(String[] args) { //定义数组,我这里用简单的语法定义 int[] nums={23,12,34,2,67}; //进行几轮比较,确定几个位置 for(int i=0;i<nums.length-1;i++){ for(int j=0;j<nums.length-1-i;j++){ if(nums[j]>nums[j+1]){ int tmp=nums[j+1]; nums[j+1]=nums[j]; nums[j]=tmp; } } System.out.print("第"+(i+1)+"次排序后的结果:"); for(int k=0;k<nums.length;k++){ System.out.print(nums[k]+" "); }System.out.println(""); } System.out.println("冒泡后的数组="); for(int num:nums){ System.out.print(num+" "); } } }
结果输出:
这个东西,我纠结了三天,今天五一,出去看楼去了,参观了别人家的山体别野,尼玛,回来就开窍了。总结:人生,需要刺激!