1. 复杂度和简单排序算法(选择排序、冒泡排序、插入排序)

0. 认识时间复杂度

image

1. 选择排序

image
image

代码示例

import java.util.Arrays;

public class MySort {
    public static void selectionSort(int[] arr){
        // 特殊处理
        if(arr == null || arr.length < 2) return;
        // 遍历选择最小的元素
        for (int i = 0; i < arr.length - 1; i++) {
            // 临时变量存储最小位置索引
            int minIndex = i;
            for (int j = i+1; j < arr.length; j++) {
                minIndex = arr[j] < arr[minIndex] ? j : minIndex;
            }
            if(i != minIndex) swap(arr, i, minIndex);
        }
    }

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

    // for test
    // 对数器
    public static void comparator(int[] arr){
        Arrays.sort(arr);
    }

    // for test
    // 获得随机大小的随机值数组
    public static int[] generateRandomArray(int maxSize, int maxValue){
        // Math.random() * maxSize 结果在 [0, maxSize) 区间,但不包含 maxSize。
        int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * (maxValue + 1));
        }
        return arr;
    }

    // for test
    // 数组的复制
    public static int[] copyArray(int[] arr){
        // 特殊情况处理,避免异常
        if(arr == null) return null;
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            res[i] = arr[i];
        }
        return res;
    }

    // for test
    // 判断结果是否相等
    public static boolean isEqual(int[] arr1, int[] arr2){
        if((arr1 == null && arr2 != null) || arr1 != null && arr2 == null)
            return false;
        if(arr1 == null && arr2 == null)
            return true;
        if(arr1.length != arr2.length)
            return false;
        for (int i = 0; i < arr1.length; i++) {
            if(arr1[i] != arr2[i]) return false;
        }
        return true;
    }

    // for test
    // 输出
    private static void printArray(int[] arr) {
        if(arr == null) return;;
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }


    public static void main(String[] args) {
        int testTime = 500000;
        int maxSize = 100;
        int maxValue = 100000;
        boolean succeed = true;
        for (int i = 0; i < testTime; i++) {
            int[] arr1 = generateRandomArray(maxSize, maxValue);
            int[] arr2 = copyArray(arr1);
            // 开始排序
            selectionSort(arr1);
            comparator(arr2);
            // 判断结果是否相等
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                printArray(arr1);
                printArray(arr2);
            }
        }
        System.out.println(succeed ? "Nice!" : "Fucking fucked!");

        int[] arr = generateRandomArray(maxSize, maxValue);
        printArray(arr);
        selectionSort(arr);
        printArray(arr);
    }
}

2. 冒泡排序

image

image

代码示例

import java.util.Arrays;

public class MySort {
    public static void bubbleSort(int[] arr){
        if(arr == null || arr.length < 2) return;;
        for(int i = arr.length-1; i > 0; i--){
            for (int j = 0; j < i; j++) {
                if(arr[j] > arr[j + 1]) swap(arr, j, j+1);
            }
        }
    }

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

    // for test
    // 对数器
    public static void comparator(int[] arr){
        Arrays.sort(arr);
    }

    // for test
    // 获得随机大小的随机值数组
    public static int[] generateRandomArray(int maxSize, int maxValue){
        // Math.random() * maxSize 结果在 [0, maxSize) 区间,但不包含 maxSize。
        int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * (maxValue + 1));
        }
        return arr;
    }

    // for test
    // 数组的复制
    public static int[] copyArray(int[] arr){
        // 特殊情况处理,避免异常
        if(arr == null) return null;
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            res[i] = arr[i];
        }
        return res;
    }

    // for test
    // 判断结果是否相等
    public static boolean isEqual(int[] arr1, int[] arr2){
        if((arr1 == null && arr2 != null) || arr1 != null && arr2 == null)
            return false;
        if(arr1 == null && arr2 == null)
            return true;
        if(arr1.length != arr2.length)
            return false;
        for (int i = 0; i < arr1.length; i++) {
            if(arr1[i] != arr2[i]) return false;
        }
        return true;
    }


    // for test
    // 输出
    private static void printArray(int[] arr) {
        if(arr == null) return;;
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }


    public static void main(String[] args) {
        int testTime = 500000;
        int maxSize = 100;
        int maxValue = 100000;
        boolean succeed = true;
        for (int i = 0; i < testTime; i++) {
            int[] arr1 = generateRandomArray(maxSize, maxValue);
            int[] arr2 = copyArray(arr1);
            // 开始排序
            bubbleSort(arr1);
            comparator(arr2);
            // 判断结果是否相等
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                printArray(arr1);
                printArray(arr2);
            }
        }
        System.out.println(succeed ? "Nice!" : "Fucking fucked!");

        int[] arr = generateRandomArray(maxSize, maxValue);
        printArray(arr);
        bubbleSort(arr);
        printArray(arr);
    }
}

异或运算:无进位相加。

image

image

(1)异或运算的应用1

image

代码示例

public class Test {
    public static void main(String[] args) {
        int a = 5;
        int b = 7;

        a = a ^ b;
        b = a ^ b;
        a = a ^ b;

        System.out.println(a);
        System.out.println(b);
    }
}

(2)异或运算的应用2

image

两种数数出现奇数次:

image

代码示例

public class Test {
    // 只有一个数出现奇数次
    private static void printOddTimesNum1(int[] arr1) {
        int res = 0;
        for (int i : arr1) {
            res ^= i;
        }
        System.out.println(res);
    }

    // 两个不同的树出现奇数次
    private static void printOddTimesNum2(int[] arr2) {
        int res = 0;
        int a = 0;
        int rightOne = 0;
        for(int i : arr2){
            res ^= i;
        }
        rightOne = res & (~res + 1); // 提取最右侧的1
        for (int i : arr2) {
            if((rightOne & i) == 0)  a ^= i;
        }
        System.out.println(a + " " + (a ^ res));
    }

    public static void main(String[] args) {
        int[] arr1 = { 3, 3, 2, 3, 1, 1, 1, 3, 1, 1, 1 };
        printOddTimesNum1(arr1);

        int[] arr2 = { 4, 3, 4, 2, 2, 2, 4, 1, 1, 1, 3, 3, 1, 1, 1, 4, 2, 2 };
        printOddTimesNum2(arr2);
    }
}

Tips:提取最右的1

image

3. 插入排序

image

image

代码示例

import java.util.Arrays;

public class MySort {
    public static void insertSort(int[] arr){
        if(arr == null || arr.length < 2)   return;
        for(int i = 1; i < arr.length; i++){
            for(int j = i-1; j >= 0 && arr[j] > arr[j+1]; j--)
                swap(arr, j, j + 1);
        }
    }

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

    // for test
    // 对数器
    public static void comparator(int[] arr){
        Arrays.sort(arr);
    }

    // for test
    // 获得随机大小的随机值数组
    public static int[] generateRandomArray(int maxSize, int maxValue){
        // Math.random() * maxSize 结果在 [0, maxSize) 区间,但不包含 maxSize。
        int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * (maxValue + 1));
        }
        return arr;
    }

    // for test
    // 数组的复制
    public static int[] copyArray(int[] arr){
        // 特殊情况处理,避免异常
        if(arr == null) return null;
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            res[i] = arr[i];
        }
        return res;
    }

    // for test
    // 判断结果是否相等
    public static boolean isEqual(int[] arr1, int[] arr2){
        if((arr1 == null && arr2 != null) || arr1 != null && arr2 == null)
            return false;
        if(arr1 == null && arr2 == null)
            return true;
        if(arr1.length != arr2.length)
            return false;
        for (int i = 0; i < arr1.length; i++) {
            if(arr1[i] != arr2[i]) return false;
        }
        return true;
    }


    // for test
    // 输出
    private static void printArray(int[] arr) {
        if(arr == null) return;;
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
    
    public static void main(String[] args) {
        int testTime = 500000;
        int maxSize = 100;
        int maxValue = 100000;
        boolean succeed = true;
        for (int i = 0; i < testTime; i++) {
            int[] arr1 = generateRandomArray(maxSize, maxValue);
            int[] arr2 = copyArray(arr1);
            // 开始排序
            insertSort(arr1);
            comparator(arr2);
            // 判断结果是否相等
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                printArray(arr1);
                printArray(arr2);
            }
        }
        System.out.println(succeed ? "Nice!" : "Fucking fucked!");

        int[] arr = generateRandomArray(maxSize, maxValue);
        printArray(arr);
        insertSort(arr);
        printArray(arr);
    }
}

4. 二分法

image

5. 对数器

image

6. 递归

image

求中点位置

image

最大值

image
image

a:几个递归

b:递归的规模(等规模)

d:除了递归剩下过程的复杂度

posted @ 2025-09-08 11:20  无敌美少女战士  阅读(18)  评论(0)    收藏  举报