Java冒泡排序法和选择排序法

冒泡排序法和选择排序法

本人学生党一枚。Java学习过程,写这个博客纯属当复习,有什么错误的地方请大家指出来在评论里指点指点我。谢谢

冒泡排序法

概念:
从前向后(或从后向前)依次比较相邻的元素,若发现逆顺序,则交换。小的向前换,大的向后换,像水底的气泡逐渐向上冒,顾名思义冒泡排序法。
通俗一点就是把大的往上挪!向冒泡一样。
是交换式排序法的一种。冒泡排序法效率较低。
冒泡过程

冒泡排序法思路

1:外层循环:控制它要走几次。
假设你有5个数,那就要走4次,最后一次不用走,最后那个数已经在它位置了所以就要length-1次。
2:内层循环:控制逐一比较,如果发现前一个数比后一个数大,则交换。
注意!因为越比较长度就越小了,所以长度要length-1-i。

package com.test_1;

public class Demo5_3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int arr [ ] ={1,6,0,-1,9};
        int temp=0;//中间值
        //-------冒泡排序法
        //外层循环,它决定一共走几趟
        for(int i = 0;i<arr.length-1;i++){
            //内层循环,开始逐个比较
            //如果我们发现前一个数比后一个数大,则交换
            for(int j=0;j<arr.length-1-i;j++){
                if (arr[j]>arr[j+1]) {
                    //换位
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }

        }
        //输出结果
        for(int i = 0;i<arr.length;i++){
            System.out.print(arr[i]);
        }

    }

}

选择排序法

概念:
第一次从R[0]~R[n-1]中选取最小值,与R[0]交换。第二次从R[1]~R[n-1]中选取最小值与R[1]交换。。。以此类推。
通俗点说就是每次找到后面元素的最小值然后与之交换。
选择排序法效率中。
选择排序过程

选择排序思路
1:外层循环:要走几趟,同样是length-1。
2:设置一个最小值。假设第一个就是最小值。
3:设置一个最小值下标
4:内层循环:那你当前的最小值去逐一比较。当有比当前最小值小的数时,记录最小值,记录下标。
5:退出内层循环后就交换位置。

package com.test_1;

public class Demo5_3 {

    public static void main(String[] args) {


        //简单测试数组
        int arr [ ] ={1,6,0,-1,9,1000,-1000,98,-687};

        //调用选择排序法
        Select select = new Select();
        select.sort(arr);
    }

}


//--------------选择排序法
class Select{
    public void sort(int arr[]){
        //中间值
        int temp = 0;

        //外循环:我认为最小的数,从0~长度-1
        for(int j = 0; j<arr.length-1;j++){
            //最小值:假设第一个数就是最小的
            int min = arr[j];
            //记录最小数的下标的
            int minIndex=j;

            //内循环:拿我认为的最小的数和后面的数一个个进行比较
            for(int k=j+1;k<arr.length;k++){
                //找到最小值
                if (min>arr[k]) {
                    //修改最小
                    min=arr[k];
                    minIndex=k;
                }
            }
            //当退出内层循环就找到这次的最小值
            //交换位置
            temp = arr[j];
            arr[j]=arr[minIndex];
            arr[minIndex]=temp;
        }
        //输出结果
        for(int i = 0;i<arr.length;i++){
            System.out.print(arr[i]+"   ");
        }

    }
}

最后再比较一下两个排序法之间的效率差异:
代码

package com.test_1;

import java.util.Calendar;

public class Demo5_3 {

    public static void main(String[] args) {

        //构建一个庞大的无序数组用于测试时间
        int len=100000;
        int arr1 [] = new int [len];
        for(int i=0;i<len;i++){
            //让程序随机产生一个1~10000的数
            //Math.random()会产生一个0~1的数
            int t = (int)(Math.random()*10000);
            arr1[i] = t;
        }

        //简单测试数组
        int arr [ ] ={1,6,0,-1,9,1000,-1000,98,-687};

        //获得时间实例
        Calendar cal = Calendar.getInstance();

        //在排序前打印系统时间
        System.out.println("冒泡排序法开始"+cal.getTime());
        //调用冒泡排序法
        Bubble bubble = new Bubble();
        bubble.sort(arr1);
        //重新获得时间实例
        cal = Calendar.getInstance();
        System.out.println("冒泡排序法结束"+cal.getTime());


        //重新获得时间实例
        cal = Calendar.getInstance();
        System.out.println("选择排序法开始"+cal.getTime());
        //调用选择排序法
        Select select = new Select();
        select.sort(arr1);
        //重新获得时间实例
        cal = Calendar.getInstance();
        System.out.println("选择排序法结束"+cal.getTime());
    }

}

//-----------------冒泡排序法
class Bubble{
    //排序方法
    public void sort(int arr[]){
        int temp=0;//中间值
        //-------冒泡排序法
        //外层循环,它决定一共走几趟
        for(int i = 0;i<arr.length-1;i++){
            //内层循环,决定每一趟循环的次数
            //如果我们发现前一个数比后一个数大,则交换
            for(int j=0;j<arr.length-1-i;j++){
                if (arr[j]>arr[j+1]) {
                    //换位
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }

        }   
        /*//输出结果
                for(int i = 0;i<arr.length;i++){
                    System.out.print(arr[i]+"   ");
                }*/
    }   
}


//--------------选择排序法
class Select
{
    public void sort(int arr[])
    {
        //中间值
        int temp = 0;

        //外循环:我认为最小的数,从0~长度-1
        for(int j = 0; j<arr.length-1;j++)
        {
            //最小值:假设第一个数就是最小的
            int min = arr[j];
            //记录最小数的下标的
            int minIndex=j;

            //内循环:拿我认为的最小的数和后面的数一个个进行比较找到下标
            for(int k=j+1;k<arr.length;k++)
            {
                //找到最小值
                if (min>arr[k]) 
                {
                    //修改最小
                    min=arr[k];
                    minIndex=k;
                }
            }
            //当退出内层循环就找到这次的最小值
            //交换位置
            temp = arr[j];
            arr[j]=arr[minIndex];
            arr[minIndex]=temp;
        }
        /*//输出结果
        for(int i = 0;i<arr.length;i++){
            System.out.print(arr[i]+"   ");
        }*/

    }
}

运行结果:
运行结果:

  • 30
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值