zoukankan      html  css  js  c++  java
  • 插入排序与二分查找与CopyOnWrite 写时复制思想

    插入排序与二分查找

    package com.m.test;
    
    
    import java.lang.reflect.Constructor;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Random;
    import java.util.concurrent.CopyOnWriteArrayList;
    
    public class Test2 {
        public static void main(String[] args) {
            //二分查找,加插入排序
            Random random = new Random();
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                list.add(random.nextInt(10));
            }
            System.out.println(list);
            insertSort(list);
            int i = binSearch(list, 0, list.size() - 1, 5);
            System.out.println(i);
            System.out.println(list);
        }
    
        //插入排序
        public static void insertSort(List<Integer> list) {
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = i + 1; j > 0 &&
                        list.get(j) < list.get(j - 1); j--) {
                    swap(list, j, j - 1);
                }
            }
    
        }
    
        //二分查找是查找下标
        public static int binSearch(List<Integer> list, int left, int right, int key) {
            //1、获取mid
            while (left <= right) {
                int mid = (right + left) >>> 1;
                int midVal = list.get(mid);
                if (key > midVal) {
                    left = mid + 1;
                } else if (key < midVal) {
                    right = mid - 1;
                } else {
                    return mid;
                }
            }
            return -(left + 1);
        }
    
        public static void swap(List<Integer> list, int a, int b) {
            int t = list.get(a);
            list.set(a, list.get(b));
            list.set(b, t);
        }
    
    }
    
    
    [2, 2, 6, 9, 6, 5, 9, 4, 7, 4]
    4
    [2, 2, 4, 4, 5, 6, 6, 7, 9, 9]
    

    【2】CopyOnWriteArrayList

    CopyOnWrite 写时复制
    
    读写分离思想,流行框架底层思想来源于JavaSE,JavaEE
    
    
    

    add()方法

    public boolean add(E e) {
        //final 重入锁
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            //写时复制
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            
            //同步到原来的数组中
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }
    

    get()方法

    public E get(int index) {
        return get(getArray(), index);
    }
    
    
    private E get(Object[] a, int index) {
        return (E) a[index];
    }
    
  • 相关阅读:
    js页面跳转(转载)
    insert into select union 插入数据到sqlserver中会自动排列
    一段没用的代码
    gridview中自动生成的列不可以设置只读
    Treeview 简单遍历,赋值,检查 checkbox
    线程操作一个无限循环,cpu 占用 25% 左右
    相对路径,绝对路径互转
    遍历虚拟网站下所有目录
    一个级联关系的表,向上获取各个字段名的函数
    大家用.net 大部分的工作是在干什么
  • 原文地址:https://www.cnblogs.com/k-class/p/13972569.html
Copyright © 2011-2022 走看看