算法相关记录

62 阅读2分钟

1. 排序算法

1.1 选择排序

/**
 * <p>@Description 选择排序 </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2021-01-30 </p>
 **/
public class Code03_SelectionSort {

    /**
     * 先定义一个给数组排序的方法
     * @param arr
     */
    public static void selectSort(int[] arr){
        //先考虑边界值 null 或者 长度小于2 都不需要排序
        if(arr == null || arr.length < 2){
            return;
        }
        /*
            0 ~ N-1 位置选出最小值放到0的位置
            1 ~ N-1 位置选出最小值放到1的位置
            2 ~ N-1 位置选出最小值放到2的位置
            3 ~ N-1 位置选出最小值放到3的位置
            ...
            每次都需要遍历数组的整个长度,所以需要一个值 即数组的长度
            
            28—37行的代码逻辑可以理解为:0~N-1的位置,选出一个最小值进行交换;1~N-1的位置,选出一个最小值进行交换......
         */
        int arr_length = arr.length;
        for (int i = 0; i < arr_length; i++) {
            //i从0的位置出发
            //假设每次出发的i位置数我们先当作最小值(只看到i位置,没看其他位置的数时,本身也是它最小,因为就它自己一个值)
            int minValueIndex = i;
            for (int j = i + 1; j < arr_length; j++) {
                //j从i+1出发(即i的下一个位置),遍历的每一个数都和i位置上的数进行比较,如果j位置小于i位置的数,那最小值的下标索引值变为j
                minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex;//这样一来,最小值的下标就找到了,即为minValueIndex
            }
            //i位置上的数和minValueIndex位置上的数进行交换
            swap(arr, i, minValueIndex);
        }

    }

    /**
     * 将数组i位置和j位置的数进行交换
     * @param arr
     * @param i
     * @param j
     */
    public static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;

    }

    /**
     * 提供一个方法打印数组
     * @param arr
     */
    public  static void printArr(int[] arr){

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {2,8,1,5,-6,0,1,-4,6,7,5};
        printArr(arr);//先打印排序之前的数组
        selectSort(arr);//从小到大对数组进行排序
        printArr(arr);//再打印排序之后的数组
    }
}

1.2 冒泡排序

/**
 * <p>@Description 冒泡排序 </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2021-01-30 </p>
 **/
public class Code04_BubbleSort {

    /*
        将一个数组冒泡排序
        0和1位置比较,1位置大于0位置,交换
        1和2位置比较,2位置大于1位置,交换
        N-2和N-1位置比较...
        上述比较后,最大的数在N-1位置

        再重复上述步骤,将0至N-2位置比较、交换
     */
    public static void bubbleSort(int[] arr){
        if(arr == null || arr.length < 2){
            return;
        }
        /*
            0~N-1位置 干一坨事
            0~N-2位置 干一坨事
            0~end位置 干一坨事
         */
        int arr_length = arr.length;
        //控制外层每次干事的范围
        for (int end = arr_length-1; end >= 0; end--) {
            //每次都在0~end上干一坨事
            //0和1位置比较,1和2位置比较,end-1和end位置比较
            for(int second = 1; second <= end; second++){
                if(arr[second] < arr[second -1]){
                    swap(arr, second-1, second);
                }
            }
        }

    }

    public static void swap(int[] arr, int i, int j){
        int temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
    }

    //打印数组
    public static void printArr(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {4,7,2,4,1,8,2,0,1,6,3,9};
        printArr(arr);
        bubbleSort(arr);
        printArr(arr);
    }
}

1.3 插入排序

/**
 * <p>@Description 插入排序 </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2021-01-30 </p>
 **/
public class Code05_insertSort {

    /**
     * 插入排序大概意思:
     *              0~0位置完成有序 不需要做 已完成
     *              0~1位置完成有序 1位置向前看1个位置(即0位置),如果0位置大于1位置 交换
     *              0~2位置完成有序 2位置向前看1个位置(即1位置),如果1位置大于2位置 交换
     *              0~3位置完成有序
     *              0~N位置完成有序 N位置向前看1个位置(即N-1位置),如果N-1位置大于N位置 交换
     * @param arr
     */
    public static void insertSort(int[] arr){
        for (int currentIndex = 1; currentIndex < arr.length; currentIndex++) {
            //当前索引的前一个位置;当前索引前一个位置有值 且 前一个位置的值大于后一个位置 交换;前一个位置的索引-1(再继续和左边的进行比较)
            for(int preIndex = currentIndex-1; preIndex >= 0 && arr[preIndex] > arr[preIndex + 1]; preIndex--){
                swap(arr, preIndex, preIndex + 1);
            }
        }
    }

    /**
     * 数组arr的i位置数和j位置数进行交换
     * @param arr
     * @param i
     * @param j
     */
    public static void swap(int[] arr, int i, int j){
        int temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
    }

    public static void printArr(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {4,7,2,4,1,8,2,0,1,6,3,9,1};
        printArr(arr);
        insertSort(arr);
        printArr(arr);
    }
}

2. 类型输出

2.1 X类型的数值以Y进制输出

2.1.1 int类型以二进制输出

/**
 * <p>@Description 将一个数已二进制打印 </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2021-01-29 </p>
 **/
public class Code01_PrintBinary {

    public static void printToBinary(int num){
        /*
        * int存储时转换为32位二进制
        * 任何数和1与的结果都为它原本的值,1左移n位再和那个数进行与运算后,如果该数本身位的值为1,那结果就是1,如果该数本身位的值为0,和0进行与运算后结果还是0
        * 理解一下 num & (1 << i)  num 与 左移i位的1 进行与运算; 1左移i位就单纯理解1向左移动了i位,右边用0填补
        * */
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1 << i)) == 0 ? "0" : "1");
        }
        System.out.println();
    }

    public static void main(String[] args) {
//        int num = 8;
//        printToBinary(num);
//
//        int max = Integer.MAX_VALUE;
//        printToBinary(max);

        printToBinary(-8);
        printToBinary(8);
    }
}