java 冒泡排序 经典算法题

//        冒泡排序:经典算法题。
//        有一组数字 2,10,8,20,11,把这组数按照从大到小的顺序排列出来。20,11,10,8,2
//        2,10,8,20,11
//        找出最大的数,放到第一位(1,2,3,4,5)
//        20,10,8,2,11
//        从剩下的4个数中,找最大的(2,3,4,5)
//        20,11,8,2,10
//        从剩下的3个数中,找最大的(3,4,5)
//        20,11,10,2,8
//        从剩下的2个数中,找最大的(4,5)
//        20,11,10,8,2

 

※注意下:下面3种方法中的结果,是降序的,也就是从大到小顺序排列,真正的冒泡排序好像是从小到大的?

 

上面是题中给的步骤,我没仔细看  先自己想了想 (随便看看  有空再尽可能改改)

int[] a = {2,10,8,20,11};        
        boolean panDuan = true;
        int num = 0;

        System.out.println("输出原数组:");        //输出原数组
        for (int i : a) {
            System.out.print(i+" ");
        }
        System.out.println();
        while(panDuan)                       //最外层循环 设置成死循环,只有当内层循环判定条件满足后才跳出循环 
        {
            for(int i = 0 ; i<4 ;i++)        //i为 数组下标,因为4是最后一位,如果前面运行正常,是不需要再比较的.所以范围设置为i<4就可以了
            {
                for(int j = 4 ; j>=0 ;j--)    // j同为数组下标,数组下标为i的元素,与数组中的元素,以倒序的顺序依次比较.
                {
                    if(i == j)            //当i = j 时,如果前面运行正确,是不需要再比较的 ,并且不继续运行下去,所以跳出变量为j的循环,继续执行变量为i的循环
                    {
                        break ;
                    }else if(a[i]<a[j])            //当满足条件,交换两个元素的位置
                    {
                        
                        a[i] = a[i]+a[j];
                        a[j] = a[i] - a[j];
                        a[i] = a[i] - a[j];                    
                    }
                }
            }            
            for(int k = 0 ; k <4 ; k++)            //检测循环   用来判断 现在的数组是否达到条件
            {
                for(int l = 4 ;l >= 0 ; l--)
                {
                    if(k == l)
                    {
                        break ;
                    }else if(a[k]>a[l])            //判断大小
                    {
                        num++;                   //如果条件正确,num+1
                    }
                }                
            }
            if(num == 10)                        //如果条件都正确,那么num应该加10次,所以 当num=10,将布尔值的panDuan值改成false,就可以跳出while循环.
            {
                panDuan = false;
            }
            num = 0;                            //如果一次循环达到想要的数组,将num归0,继续循环直到正确.                
        }                                             //while 结束括号        
        System.out.println("输出排序后数组:");
        for (int m : a) {
            System.out.print(m+" ");
        }
        
    }
}

第二种方法: 

这个应该是不使用 java.util.Arrays.sort(a);的话,最好的方法吧,更容易理解,更简单,适用性更强不用考虑数组长度.

for(int i= 0 ;i<a.length ; i++)
        {
            for(int j = i+1 ; j<a.length ; j++)
            {
                if(a[i]<a[j])
                {
                    a[i] = a[i] + a[j];
                    a[j] = a[i] - a[j];
                    a[i] = a[i] - a[j];
                }
            }
        }

第三种方法:

将排序后的数组中的元素,依次找出来,数组长度大的话会非常麻烦.

int max = a[0];   
        for(int i= 1 ; i<a.length ; i++)       //确定了排序成功后数组中第一个数
        {
            // 从第2位开始比较,找出最大的数
            if(max<a[i])
            {        
                //当前位和最大数所在的位,交换
                a[0] = a[i];
                a[i] = max;
                max = a[0];
            }
        }        
        System.out.println("***交换后***");
        for (int m : a) {
            System.out.print(m+" ");
        }
        
        int max1 = a[1];
        for(int j= 2 ; j<a.length ; j++)    //确定了排序成功后数组中第二个数
        {
            if(max1<a[j])
            {                
                a[1] = a[j];
                a[j] = max1;
                max1 = a[1];
            }
        }
        System.out.println("***交换后***");
        for (int m : a) {
            System.out.print(m+" ");
        }
        
        int max2 = a[2];
        for(int k= 3 ; k<a.length ; k++)    //确定了排序成功后数组中第三个数
        {
            if(max2<a[k])
            {                
                a[2] = a[k];
                a[k] = max2;
                max2 = a[2];
            }
        }
        System.out.println("***交换后***");
        for (int m : a) {
            System.out.print(m+" ");
        }
        
        int max3 = a[3];
        for(int l= 4 ; l<a.length ; l++)    //确定了排序成功后数组中第四个数
        {
            if(max3<a[l])
            {                
                a[3] = a[l];
                a[l] = max3;
                max3 = a[3];
            }
        }
        System.out.println("***交换后***");
        for (int m : a) {
            System.out.print(m+" ");
        }

 

 第四种:

使用Arrays.sort()方法

升序排列数组

 

//import java.util.Arrays;   注意要先导入
        int[] a = {2,10,8,20,11};        
        Arrays.sort(a);        
        for (int i : a) {
            System.out.print(i+" ");
        }

 

注意结果是升序的,跟上面的最后结果不同.

 

 

 

(初学java,博客记录为主,轻喷,错误想必不少,如果您能指出,不胜感激,部分内容非原创,来源于百度)

转载于:https://www.cnblogs.com/j1639797/p/9581722.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值