【筆記】牛客網算法

時間複雜度

冒泡排序

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

選擇排序

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;
            swap(arr, i, minIndex);
        }
    }

插入排序

public static void insertionSort(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);
    }

對數器

  1. 隨機產生器:產生隨機數組
  2. 準備一個絕對正確的方法:不需考慮時間複雜度,保證絕對正確即可
  3. 實現比對的方法
  4. 把方法a和方法b比對很多次來驗證方法a是否正確
  5. 如果有一個樣本是的比對出錯,打印樣本分析是哪個方法出錯
  6. 當樣本數量很多時比對測試依然正確,可以確定方法a已經正確

以冒泡排序爲例

  1. 隨機發生器

    public static int[] generateRandomArray(int size, int value){
        int[] arr = new int[(int) ((size + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++)
            arr[i] = (int)((value + 1) * Math.random()) - (int)(value * Math.random());//只要是隨機數就行
        return arr;
    }
  2. 準備一個絕對正確的方法

    public static void rightMathod(int[] arr){
        Arrays.sort(arr);
    }
  3. 實現比對的方法

    //判斷兩個數組相等
    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;
    }
  4. //Main
    public static void main(String[] args) {
        //自己設置
        int testTime = 500000;
        int size = 10;
        int value = 100;
        boolean succeed = true;
        for (int i = 0; i < testTime; i++){
            int[] arr1 = generateRandomArray(size,value);//生成器
            int[] arr2 = copyArray(arr1);//拷貝arr1
            int[] arr3 = copyArray(arr1);
            bubbleSort(arr1);
            rightMathod(arr2);
            if(!isEqual(arr1,arr2)){
                succeed = false;
                printArrays(arr3);//將錯誤的樣本打印出來
                break;
            }        
        }
        System.out.println(succeed ? "Nice!" : "Error!");
    }
    
    //複製數組
    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 int[] printArrays(int[] arr){
        ...
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章