05排序之冒泡排序

冒泡排序算法

数据结构整理目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNRhDp2z-1578045739306)(images/03.jpg)]

基本介绍

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移至后部。就像水底下的气泡一样逐渐向上冒

分析

/**
	对 3 9 -1 10 20 进行冒泡排序
	
**/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXgckERo-1578045739308)(images/01.png)]

冒泡排序规则小结

  1. 一共进行数组的大小-1次大的循环( size-1)
  2. 每一趟排序的次数在逐渐的减少 (size-i-1)

代码实现

package F排序;

import java.util.Arrays;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/1/3 0003  16:47
 * 冒泡排序
 */
public class BubbleSort {

    public static void main(String[] args) {

        int[] arr = {3,9,-1,10,20};
        System.out.println("原始数组"+Arrays.toString(arr));

        bubbleSort(arr);
        System.out.println("最终的排序结果为"+Arrays.toString(arr));


    }

    public static void bubbleSort(int[] arr){

        int size = arr.length;//数组的长度

        for(int i =0;i<size-1;i++){//需要排序size-1趟
			/**
			第一趟排序就是将最大的数排在最后
			第二趟排序就是将次大的数排在倒数第二个位置
			。。。。。。。。。。。 
			**/
          for(int j=0;j<size-i-1;j++){//从第一个元素开始两两对比
              
                if(arr[j]>arr[j+1]){//假如前面的数比后面的数大,则交换
                    int temp = arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
                System.out.println("第"+i+"趟;"+"第("+j+"论的排序结果为"+Arrays.toString(arr));
            }
            System.out.println("======================");
        }


    }

}

实现的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8oHKhMrS-1578045739311)(images/02.png)]

存在的问题:大量重复判断,重复的比较判断

代码的改进

优化

==因为在排序的过程中,各元素不断接近自己的位置,如果下一趟比较下来没有进行过交换,就说明序列有序。==因此要在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较。

/**
     * 改进的算法
     * @param arr
     */
    public static void bubbleSort2(int[] arr){

        int size = arr.length;//数组的长度

        for(int i =0;i<size-1;i++){//需要排序size-1趟
            boolean flag = false; //用来标志是否进行交换
         for(int j=0;j<size-i-1;j++){//从第一个元素开始两两对比

                if(arr[j]>arr[j+1]){//假如
                    int temp = arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                    flag = true;
                }
                System.out.println("第"+i+"趟;"+"第("+j+"论的排序结果为"+Arrays.toString(arr));
            }
            System.out.println("======================");
            if(!flag){//没有进行交换说明已经有序,则停止冒泡
                break;
            }
        }


    }


性能的分析

//测试一下冒泡排序的速度O(n^2) ,给80000个数据,测试
        //创建要给80000个随机的数组
        int[] arr = new int[80000];
        for (int i=0;i<80000;i++){
            arr[i]=(int)(Math.random()*800000);//产生一个[0,800000)的随机数

        }

        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat1  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str = simpleDateFormat1.format(date1);
        System.out.println("排序前的时间是"+date1Str);

        //测试冒泡排序
        bubbleSort(arr);
        Date date2 = new Date();
        String date2Str = simpleDateFormat1.format(date2);
        System.out.println("排序后的时间是"+date2Str);

/**
	运行结果:
			排序前的时间是2020-01-03 17:56:38
              排序后的时间是2020-01-03 17:56:53  
              
              8000个数据排序大概是 8秒(不同电脑性能可能不一样)
**/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值