冒泡排序及其优化

冒泡核心思想:
冒泡排序向右边冒泡的话,结果就是最后一个数就是最大的
冒泡排序向左边冒泡的话,结果就是第一个数就是最小的

这个好像不是冒泡吧。。。

private static void maoPaoSort(int [] arr){
        for(int i=0;i<arr.length;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j]){
                    swap(arr,i,j);
                }
            }
        }
    }

常规冒泡

private static void maoPaoSort1(int [] arr){
        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]){
                    swap(arr,j,j+1);
                }
            }

        }
    }

flag标志是否已经有序

private static void maoPaoSort2(int [] arr){
        for(int i=0;i<arr.length-1;i++){
            boolean flag = false;
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    swap(arr,j,j+1);
                    flag = true;
                }
            }
            //说明已经有序
            if(!flag){
                return;
            }
        }
    }

双向冒泡

 private static void maoPaoSort3(int [] arr){
        int left = 0,right = arr.length-1;

        while(left<right){

            for(int i=left;i<right;i++){
                if(arr[i]>arr[i+1]){
                    swap(arr,i,i+1);
                }
            }
            right--;

            for(int j=right;j>left;j--){
                if(arr[j]<arr[j-1]){
                    swap(arr,j,j-1);
                }
            }
            left++;
        }

    }

双向冒泡+记录swapPos

private static void maoPaoSort4(int [] arr){
        int left = 0,right = arr.length-1;
        int swapPos = left;

        while(left<right){

            for(int i=left;i<right;i++){
                if(arr[i]>arr[i+1]){
                    swap(arr,i,i+1);
                    swapPos = i;
                }
            }
            right = swapPos;

            for(int j=right;j>left;j--){
                if(arr[j]<arr[j-1]){
                    swap(arr,j,j-1);
                    swapPos = j;
                }
            }
            left = swapPos;
        }

    }

http://www.niftyadmin.cn/n/1037394.html

相关文章

set的使用

set&#xff0c;顾名思义&#xff0c;它是一个集合&#xff0c;它当中没有重复的元素&#xff0c;并按照顺序排列好 使用场景 : set一般用于查找问题中的查找有无&#xff0c;即给定一个元素判断这个元素是否存在于这个数组中。还可以用来删除数组中特定的数&#xff08;因为复…

LongAdder是啥?

本文源码研究基于jdk1.8 阅读ConcurrentHashMap源码的时候发现了很多CountCell&#xff0c;看不太懂&#xff0c;所以先来研究一下LongAdder。 LongAdder是啥&#xff1f; LongAdder是用来做线程安全的i自增操作的&#xff0c;我们知道AtomicLong也可以现实这个功能&#xff0…

ConcurrentHashMap-属性解释

ConcurrentHashMap-属性解释 代表hashmap最大能存这么多个键值对 高两位目的是为了控制&#xff1f;知道的评论区说下 private static final int MAXIMUM_CAPACITY 1 << 30;代表hashmap默认容量 private static final int DEFAULT_CAPACITY 16;数组的最大长度 stat…

map的使用

map&#xff0c;我们一般称为字典或是映射&#xff0c;它提供了一对一的映射关系 使用场景 : map用于查找问题中某个元素出现的次数&#xff0c;比如问‘a’这个元素在数组中出现了多少次。这个只是最基本的应用场景&#xff0c;由于可以有任意的键值对的对应&#xff0c;map的…

ConcurrentHashMap-put

ConcurrentHashMap-put 推荐先读&#xff1a;ConcurrentHashMap属性解释 putVal主流程 initTable初始化table分支流程 helpTransfer帮助扩容分支流程 putVal主流程锁住桶后&#xff0c;链表插入/更新 putVal主流程锁住桶后&#xff0c;红黑树插入/更新 putVal主流程ad…

java变量使用,基础类型使用

先来了解java的基础比较常用的几种基础数据类型 int 整数类型 如 10 20 30 String 字符串类型 如 “你好” double 小数点类型 如 99.99 boolean 只有两个值 true 或 false true代表真 false代表假 定义变量的方法 为 类型 变量名 值 例如 int min 13; 这里我们定义了 一个…

排列问题

回溯法首先能处理一种排列问题&#xff0c;即全排列 题目 给定一个没有重复数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: 3 1 2 3 输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 有一个递归公式&#xff1a;perm(nums[0…n-1]) {取出一个数字} perm(nums[0……

缓存双写一致性

缓存双写一致性对于读&#xff1a;先读缓存&#xff0c;缓存没有&#xff0c;再读ku&#xff0c;回写缓存&#xff0c;这种没啥说的。对于写&#xff1a;先写库&#xff0c;再删除缓存&#xff0c;本文主要基于这种来探讨一下这样处理有什么问题&#xff1f; 如下图所示&#…