左神算法1-1 笔记

时间复杂度

(1)找出数组中的最大值
初始化一个变量max,遍历数组,和max比较(比较是常数级操作),时间复杂度为N和常数的乘积

(2) 在有序数组中找目标数
二分法:每次砍掉一半 代价:log2N

(3) 有序数组A(长度为N),有序数组B(长度为M) 找出数组A和数组B的公共部分
思路一:
A中的每个元素和B中的每个元素比较
for(1… M) { for (1…N) }
时间复杂度:O(N*M)

思路二:
二分查找
for(1…M){ 在A中二分查找}
时间复杂度:O(N*logM)

思路三:
每个数组的起始位置设一个指针,比较,谁小谁动,一定可以找到相同的数,然后一起动,最多动N+M次
时间复杂度:O(N+M)

空间复杂度

(额外空间:输入输出不算在额外空间中)
以空间置换时间
(1)数组左右部分交换 比如 123 45 输出 45 123
思路一 :
找一个辅助数组,拷贝右边的到该数组中,再把左边的拷贝到该数组

思路二:
各部分先逆序,然后整体逆序
比如 12345 67
各部分逆序:54321 76
整体逆序:67 12345
(逆序不占用额外空间)

对数器

作用:生成大量的测试用例,来验证程序正确。
对数器构造框架:
待测方法a,

  1. 实现一个绝对正确但是复杂度不好的方法b,
  2. 实现一个随机样本产生器
  3. 实现比对的方法
  4. 把方法a和方法b比对很多次来验证方法a是否正确。
  5. 如果有一个样本使得比对出错, 打印样本分析是哪个方法出错
  6. 当样本数量很多时比对测试依然正确, 可以确定方法a已经正确。

冒泡排序

public class bubbleSort0 {
    
    
    public static void bubble(int[] arr){
    
    
        if(arr == null || arr.length <2){
    
    
            return ;
        }
        for(int i = 0;i<arr.length;i++){
    
    
            for(int j = 0;j<arr.length-i-1;j++){
    
    
                if(arr[j]>arr[j+1]){
    
    
                    swap(arr,j,j+1);
                }
            }
        }
    }
    private static void swap(int[] arr,int a,int b) {
    
    
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
    public static void main(String[] args) {
    
    
        int[] a = {
    
    1,4,32,34,22,12};
        bubble(a);
        for(int i = 0;i<a.length;i++){
    
    
            System.out.println(a[i]);
        }
    }
}

注意:
下面这个交换方法是错的:

    public static void swap_error(int a, int b) {
    
    
        int temp = a;
        a = b;
        b = temp;
    }

这样的方法再C++中可以,但是java中无效,原因是java基本数据类型为值传递,swap_error中的参数a和b为形参,调用此方法的arr[j]和arr[j+1]为实参,实参将值传递给a,b,由形参ab进行值的交换,由于不是引用传递而是值传递,在调用此方法后,arr[j]和arr[j+1]还是没有变化

引入对数器:
生成随机大小的随机数组

 public static int[] generateRandomArray(int maxsize, int maxValue) {
    
    
        //Math.random():随机获得在0和1之间的一个数([0,1))  如果maxsize 是100 则arr的大小取值范围为[0,100]
        int[] arr = new int[(int) ((maxsize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
    
    
           //值是随机的
            arr[i] = (int) ((maxValue + 1) * Math.random() - (int) (maxValue * Math.random()));
        }
        return arr;
    }

绝对正确的方法:

 public static void comparator(int[] arr) {
    
    
        Arrays.sort(arr);
    }

对比的方法:

 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;
    }

整体代码:

import java.util.Arrays;

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

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

    public static void comparator(int[] arr) {
    
    
        Arrays.sort(arr);
    }

    public static int[] generateRandomArray(int maxsize, int maxValue) {
    
    
        //Math.random():随机获得在0和1之间的一个数([0,1))  如果maxsize 是100 则arr的大小可能是[0,100]
        int[] arr = new int[(int) ((maxsize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
    
    
            arr[i] = (int) ((maxValue + 1) * Math.random() - (int) (maxValue * Math.random()));
        }
        return arr;
    }

    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;
    }

    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;
    }

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

    public static void main(String[] args) {
    
    
        int testTime = 50000000;
        int maxSize = 100;
        int maxValue = 100;
        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);
                break;
            }
        }
        System.out.println(succeed ? "nice" : "bad");
    }
}

猜你喜欢

转载自blog.csdn.net/stonney/article/details/111301970