Java 冒泡排序 二分查找 包装类 自动装箱

13.01_冒泡排序

  A:原理
  		相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。
public class MyTest2 {
    public static void main(String[] args) {
        //数组的排序:通过对数组元素的比较替换移动位置等等,是一个无序序
        //列,变成一个有序序列。
        int[] arr = {24, 69, 80, 57, 13};
        //冒泡排序:元素两两比较,把最大的元素往后放,经过一轮排序 ,最大
        //的元素,就出现在了最后面。
        //ctrl+alt+M 抽取方法
        //tuiDao(arr);
        //第一轮:比四次
        for(int j = 0;j < arr.length - 1;j++){
            for (int i = 0; i < arr.length - 1 - j; i++) {
                if (arr[i] > arr[i + 1]) {
                    int t = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = t;
                }
            }
        }
    }
    private static void tuiDao(int[] arr){
        //第一轮:比4次
        for (int i = 0; i < arr.length - 1; i++) {
            if(arr[i] > arr[i+1]){
                int t = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = t;
            }
        }
        System.out.println(Arrays.toString(arr));

        //第二轮:比3次
        for (int i = 0; i < arr.length - 1 - 1; i++) {
            if(arr[i] > arr[i+1]){
                int t = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = t;
            }
        }
        System.out.println(Arrays.toString(arr));

        //第三轮:比2次
        for (int i = 0; i < arr.length - 1 - 1 - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                int t = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = t;
            }
        }
        System.out.println(Arrays.toString(arr));

        //第三轮:比1次
        for (int i = 0; i < arr.length - 1 - 1 - 1 - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                int t = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = t;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

在这里插入图片描述

13.02_选择排序

  A:原理
  		 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出
  		 现在了最小索引处
public class MyTest2 {
    public static void main(String[] args) {
        //选择排序:每一次拿一个元素,和他后面的每一个元素,挨个比较,小的
        //往前放,经过一轮比较,最小的元素就会出现在最前。
        //如此往复,经过几轮数组就排序好了
        int[] arr = {24, 69, 80, 57, 13};
        //tuiDao(arr);
        for(int index = 0; index < arr.length - 1; index++) {
            for (int i = index + 1; i < arr.length; i++) {
                if (arr[index] > arr[i]) {
                    int t = arr[index];
                    arr[index] = arr[i];
                    arr[i] = t;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }

    private static void tuiDao(int[] arr) {
        //第一轮:从0索引处开始
        int index = 0;
        for (int i = 0 + 1; i < arr.length; i++) {
            if(arr[index] > arr[i]){
                int t = arr[index];
                arr[index] = arr[i];
                arr[i] = t;
            }
        }
        System.out.println(Arrays.toString(arr));

        //第二轮:从1索引处开始
        index = 1;
        for (int i = 0 + index + 1; i < arr.length; i++) {
            if (arr[index] > arr[i]) {
                int t = arr[index];
                arr[index] = arr[i];
                arr[i] = t;
            }
        }
        System.out.println(Arrays.toString(arr));

        //第三轮:从2索引处开始
        index = 2;
        for (int i = 0 + index + 1; i < arr.length; i++) {
            if (arr[index] > arr[i]) {
                int t = arr[index];
                arr[index] = arr[i];
                arr[i] = t;
            }
        }
        System.out.println(Arrays.toString(arr));

        //第4轮:从3索引处开始
        index = 3;
        for (int i = 0 + index + 1; i < arr.length; i++) {
            if (arr[index] > arr[i]) {
                int t = arr[index];
                arr[index] = arr[i];
                arr[i] = t;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

在这里插入图片描述

13.03_插入排序

  A:原理
  		 从1索引处开始,把后面的每一个元素,插入到之前的一个有序序列,使之
  		 仍保持有序。
public class MyTest2 {
    public static void main(String[] args) {
        int[] arr = {9, 1, 2, 4, 3, 5, 7, 6, 8, 11, 10, 13, 12};
        //直接插入排序:从1索引处开始,把后面的每一个元素,插入到之前的一个有序序列,使之仍保持有序。
        // [9]  1, 2, 4, 3, 5, 7, 6, 8, 11, 10, 13, 12
        // [1,9] 2, 4, 3, 5, 7, 6, 8, 11, 10, 13, 12
        // [1,2,9] 4, 3, 5, 7, 6, 8, 11, 10, 13, 12
        // [1,2,4,9] 3, 5, 7, 6, 8, 11, 10, 13, 12
        // [1, 2, 3,4, 0] 9,5, 7, 6, 8, 11, 10, 13, 12

        //外层循环控制轮次
        for (int i = 0; i < arr.length; i++) {
            //当前元素 arr[i]  他前面的元素是 arr[i-1]
            //当前元素小于前面的元素,就进行交换。
            int j = i;
            while(j > 0 && arr[j] < arr[j-1]){
                int t = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = t;
                j--;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

13.04_快速排序

public class QuickSortUtils {
    public static void quickSort(int[] arr, int start, int end) {
        //快速排序
        //挖坑填数,得到基准数所在的索引位置,以这个位置分成了左右两区,然
        //后我对左右两区进行递归调用
        if(start < end){
            //获取分成左右两区基准数所在的索引位置
            int index = getIndex(arr, start, end);  //挖坑填数
            //对左区进行递归
            quickSort(arr, start, index - 1);
            //对右区进行递归
            quickSort(arr, index + 1, end);
        }
    }

    //挖坑填数
    /*
    *   挖坑填数
               1. 将基准数挖出形成第一个坑。
               2.由后向前找比他小的数,找到后挖出此数填到前一个坑中。
               3.由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑
                 中。
               4.再重复执行2,3两步骤。
    * */

    private static int getIndex(int[] arr, int start, int end) {
        int i = start;
        int j = end;
        //定义基准数
        int x = arr[i];
        //重复2,3步骤
        while(i < j){
            //2.由后向前找比他小的数,找到后挖出此数填到前一个坑中。
            while(i < j && arr[j] >= x){
                j--;    //让索引往后退,找到了这个元素所在额位置
            }
            if (i < j) {
                arr[i] = arr[j];
                i++; //找到之后让i顺便递增一下
            }
            //3. 由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中。
            while (i < j && arr[i] < x) {
                i++;
            }
            //找到后也挖出此数填到前一个坑中。
            if (i < j) {
                arr[j] = arr[i];
                //顺便让j再减一下
                j--;
            }
        }
        //i=j
        // arr[j]=x;
        //把基准数填到最后一个坑中
        arr[i] = x;
        return i; //返回基准数所在的索引位置。
    }
}

public class MyTest2 {
    public static void main(String[] args) {
        int[] arr = {9, 1, 2, 4, 3, 5, 7, 6, 8, 11, 10, 13, 12};
        QuickSortUtils.quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
}

13.05_基本查找和二分查找

public class MyTest2 {
    public static void main(String[] args) {
        int[] arr = {9, 1, 2, 5, 4, 3, 5, 7, 100};
        //基本查找:从头开始往后找
        int index = getIndex(arr,99);
        System.out.println(index);
    }

    private static int getIndex(int[] arr, int ele) {
        for(int i = 0; i < arr.length;i++){
            if(ele==arr[i]){
                return i;
            }
        }
        return -1;  //我们喜欢用-1 表示没有找到
    }
}
public class MyTest2 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,4,4,6,7,8,9,10};
        //二分查找:前提是数组元素有序,原理:每次拿你找的这个元素,先从中
        //间位置找
        int index = getIndex(arr,4);
        int i = binarySearch0(arr,0,arr.length,4);
    }

    private static int getIndex(int[] arr, int ele) {
        //定义三个索引
        int minIndex = 0;
        int maxIndex = arr.length - 1;
        int centerIndex = (minIndex + maxIndex)/2;
        //查找
        while(minIndex <= maxIndex){
            if(ele < arr[centerIndex]){
                maxIndex = centerIndex - 1;
            }else if(ele > arr[centerIndex]){
                minIndex = centerIndex + 1;
            }else{
                return centerIndex;
            }
            //再次计算中间索引
            centerIndex = (minIndex + maxIndex)/2;
        }
        return -1;
    }

    private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {
        int low = fromIndex;    //最小索引
        int high = toIndex - 1; //最大索引
        while(low <= high){
            int mid = (low + high)>>>1;    //计算中间索引
            //获取中间索引对应的元素
            int midVal = a[mid];
            if (midVal < key) {
                low = mid + 1;
            } else if (midVal > key) {
                high = mid - 1;
            } else {
                return mid; // key found
            }
        }
        return -1;  // key not found.
    }
}

13.06_Arrays类的概述和方法使用

  A:Arrays类概述
  		   针对数组进行操作的工具类。
  		   提供了排序,查找等功能。

1.toString()

public class MyTest2 {
    public static void main(String[] args) {
        //Java中给我们提供了已给Arrays工具类,专门针对数组,提供了一下方法

        int[] arr={1, 2, 3}; //[1,2,3]
        //arr = null;
        String s = Arrays.toString(arr);    //把数组中的元素,拼接成一个
        									//漂亮的字符串返回。
        System.out.println(s);
    }
}

2.sort()

public class MyTest2 {
    public static void main(String[] args) {
        int[] arr = {9, 1, 2, 4, 3, 5, 7, 6, 8, 11, 10, 13, 12, 100, -1, -2, 0, 6, 9, 5000};
        //Arrays.sort(arr);
        Arrays.sort(arr,0,5);   //你指定一段范围的元素,进行排序。
        System.out.println(Arrays.toString(arr));
    }
}

3.二分查找

public class MyTest2 {
    public static void main(String[] args) {
        //二分查找:前提是数组元素必须有序
        int[] arr = {1, 2, 3, 4, 4, 4, 6, 7, 8, 9, 10};
        int i = Arrays.binarySearch(arr,4);
        System.out.println(i);
    }
}

4.equals()

public class MyTest4 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        int[] arr2 = {1, 2, 3, 4};
        //比较两个数组的元素是否一致。
        boolean b = Arrays.equals(arr, arr2);
        System.out.println(b);
    }

5.copyOf()

public class MyTest2 {
    public static void main(String[] args) {
        //static int[] copyOf( int[] original, int newLength)复制旧数组
        //中的元素到一个新的数组中,新的数组长度是newLength 从0开始复制
        //旧数组
        int[] arr = {1, 2, 3, 4, 5, 6, 8, 9};
        //从旧数组0索引处开始拷贝5个元素,到一个新数组中
        int[] newArr = Arrays.copyOf(arr,5);
        System.out.println(Arrays.toString(newArr));

        //根据起始索引和终止索引,从旧数组中拷贝一部分元素,到一个新数组中,
        //含头不含尾。
        int[] range = Arrays.copyOfRange(arr,2,5);
        System.out.println(Arrays.toString(range));
    }
}

13.07_基本包装类的概述

  A:为什么会有基本类型包装类
  			为了对基本类型进行更多的操作,更方便的操作,java就针对每一种基
  			本数据类型提供了对应的类类型。
  B:常用操作:		常用的操作之一:用于基本数据类型与字符串之间的转换。
  C:基本类型和包装类的对应:
  			byte				Byte
  			short				Short
  			int					Integer
  			long				Long
  			float				Floa
  			double				Double
  			char				Character
  			boolean				Boolean
public class MyTest2 {
    public static void main(String[] args) {
        /* A:
        需求:
        a:
        将100转换成二进制, 八进制, 十六进制
        b:
        判断一个数是否在int的范围内*/
        //Java为了我们更加方便的对基本数据类型来操作,给我们提供了基本类型
        //所对应的包装类型。

        int num = 100;
        String s = Integer.toBinaryString(num);    //转换成二进制
        System.out.println(s);
        String s1 = Integer.toOctalString(num);    //转换成八进制
        System.out.println(s1);
        String s2 = Integer.toHexString(num);      //转换成十六进制
        System.out.println(s2);

        int maxValue = Integer.MAX_VALUE;
        int minValue = Integer.MIN_VALUE;
        System.out.println(maxValue);
        System.out.println(minValue);
    }
}

13.08_Integer类的概述和构造方法

  A:Integer类概述
  			Integer类在对象中包装了一个基本类型int的值,
  			该类提供了多个方法,能在int类型和String类型之间相互转换,
  			还提供了处理int类型时非常有用的其他一些常量和方法
  B:构造方法
  			public Integer(int value)
  			public Integer(String s)		//要个一个字面上是数字的字符
  											//串,如果不是就会报错
public class MyTest2 {
    public static void main(String[] args) {
        //构造方法摘要
        //Integer(int value)
        //构造一个新分配的 Integer 对象,它表示指定的 int 值。
        //Integer(String s)
        //构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 
        //值。
        int num = 100;
        Integer integer = new Integer(num);
        //NumberFormatException: 数字格式化异常

        //要的是字面上是一个有效数字的字符串。
        Integer integer1 = new Integer("20");
    }
}

13.09_String和int类型的相互转换

  A:int —— String
  		   a:和""进行拼接
  		   b:public static String valueOf(int i)
  		   c:int —— Integer —— String
  		   d:public static String toString(int i)
  B:String —— int
  		   a:String —— Integer ——intValue();
  		   b:public static int parseInt(String s)
public class MyTest2 {
    public static void main(String[] args) {
        //String和int类型的相互转换
        //int---String
        int num = 100;
        String str = num + "";    //"100"
        String s = String.valueOf(num);    //"100"
        //方式3:
        Integer integer = new Integer(num);
        String s1 = integer.toString();

        //String---int  "666" -----  666
        String ss="666";
        //NumberFormatException
        int i = Integer.parseInt(ss);   //这个字符串,字面上一定是个数字
        System.out.println(i);

        Integer integer1 = new Integer(ss);
        int i1 = integer1.intValue();
        System.out.println(i1);
    }
}

13.10_JDK5的新特征自动装箱和拆箱

  A:JDK5的新特征:
  		   自动装箱:把基本类型转换为包装类类型
  		   自动拆箱:把包装类类型转换为基本类型
  B:注意事项:
  		   在使用时,Integer x = null;	代码就会出现NullPointerException。
  		   建议先判断是否为null,然后再使用
public class MyTest2 {
    public static void main(String[] args) {
        //JDK1.5 新加的特性
        //自动装箱:将一个基本数据类型,自动转换成他所对应的包装类型
        //自动拆箱:将一个包装类型,自动转换成他所对应的基本类型。

        int num = 100;
        //Integer integer = new Integer(num);
        Integer integer = num;
        Integer aa = 20;

        Integer integer2 = new Integer(num);
        int b = integer2;   //自动拆箱
    }
}
public class MyTest2 {
    public static void main(String[] args) {
        Integer ii = 100;   //自动装箱
        ii+= 20;    //自动拆箱,自动装箱

        //手动拆装箱。
        int num = 100;
        //手动装箱 valueOf(num)
        Integer integer = Integer.valueOf(num);

        //手动拆箱 intValue()
        int i = integer.intValue();
        System.out.println(i);
        int b = 20 + i;
        System.out.println(b);
    }
}
public class MyTest2 {
    public static void main(String[] args) {
        Integer i1 = new Integer(127);
        Integer i2 = new Integer(127);
        System.out.println(i1 == i2);   //false
        //Integer类也重写了父类equals()方法,比较的是包装的值是否等
        System.out.println(i1.equals(i2));     //true
        System.out.println("===================");

        Integer i3 = new Integer(128);
        Integer i4 = new Integer(128);
        System.out.println(i3 == i4);   //false
        System.out.println(i3.equals(i4));  //true
        System.out.println("===================");

        //自动装箱
        Integer i5 = 128;   //new Integer(128)
        Integer i6 = 128;   //new Integer(128)
        System.out.println(i5 == i6); // false
        System.out.println(i5.equals(i6)); //true
        System.out.println("===================");

        //自动装箱
        Integer i7 = 127;
        Integer i8 = 127;
        System.out.println(i7 == i8);   //true
        System.out.println(i7.equals(i8));  //true
    }
}
   注意:
   		1.由于我们要经常使用Integer类,所以他会提前为int型创建-128~127一
   		  共256个对象,如果在自动装箱的时候给局部变量的int型值是在上面的范
   		  围之中,就会直接将之前创建好的对象的地址值赋给等号左边的局部变量。
   		  所以(i7 == i8),但是(i5 !== i6)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值