冒泡排序以及复杂度分析(JAVA)

冒泡排序(JAVA)

冒泡排序算法的原理如下: [1]

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序是一种非常经典的算法,易于理解而且容易实现。

复杂度:

  • 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数和记录移动次数均达到最小值(代码中对应move_step=0和coms_tep=n-1次)
  • 若文件是逆序的,

时间复杂度:最差:O(N^2) 最好:O(N)

冒泡排序是稳定排序算法
代码:
使用了单例模式,方便在程序内部比较不同算法的移动/比较次数,不需要的删掉就可以

代码中in_order(List list, boolean flag)方法中的list为一个ArryList,flag=true的时候按正序排列,flag=false的时候逆序排列

/*
*冒泡排序的时间复杂度
* */
public class Bubble_sort {
    public static Bubble_sort bubble_sort;
    private Bubble_sort(){}
    private int com_step;
    private int move_step;
    public int getCom_step() {
        return com_step;
    }
    public int getMove_step() {
        return move_step;
    }
    public static Bubble_sort getBubble_sort(){
        if(bubble_sort==null){
            synchronized (Insert_sort.class){
                if(bubble_sort==null){
                    bubble_sort=new Bubble_sort();
                }
            }
        }
        return bubble_sort;
    }
    public List<Integer> in_order(List<Integer> list, boolean flag){
        com_step=0;
        move_step=0;
        Integer[] nums=list.toArray(new Integer[0]);//将列表list转为Integer对象数组
        for(int i=0;i<list.size();i++){
            for(int j=i+1;j<list.size();j++){
                com_step++;
                if(flag==true) {
                     if(nums[i]>nums[j]){
                        swap(nums,i,j);
                        move_step += 3;
                    }
                }
                else{
                    if(nums[j]>nums[i]) {
                        swap(nums, i, j);
                        move_step += 3;
                    }
                }
            }
        }
        list=new ArrayList<>(Arrays.asList(nums));
        return list;
    }
    public void swap(Integer[] tem, int i, int j) {
        int temp = tem[i];
        tem[i] = tem[j];
        tem[j] = temp;
    }
}

[1] 吕新平、刘宏铭.二级公共基础知识实战训练教程:西安交通大学出版社,2006.02

[冒泡排序及其优化]https://blog.csdn.net/qq_34231010/article/details/78759224?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F%20%E6%9C%80%E4%BC%98&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-78759224

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值