算法复杂度课后作业

算法复杂度课后作业

要求:

用 Java语言实现下列算法并进行单元测试, 请给出算法的时间复杂度。

(1)求一个整数二维数组Arr[N][N]的所有元素之和。

(2)对于输入的任意 3 个整数, 将它们按从小到大的顺序输出。

(3)对于输入的任意 n 个整数, 输出其中的最大和最小元素。

解答:

(1)要用到两个循环来做,第一个循环是列的,第二个循环是该列的第几个下标,然后将其累加,最后返回结果。用到两个循环,而且循环中的变量的增长为1。因此,第一个问题的时间复杂度是: O(n^2)

(2)第二个只是排序,我用的是快速排序法来实现排序,按照正常情况,快速排序的时间复杂度为:O(n logn),但是只输入3个数,递归一次就结束了,所以时间复杂度为: O(1)

(3)第三个直接可以用上第二问的排序先将数组顺序排好,然后将第一个和最后一个调出来就可以了。由于调出的时候时间复杂度都是O(1),因此第三问的时间复杂度和第二问的时间复杂度一样,是: O(n logn)

实现代码: Task.java

/**
 * Created by Funny_One on 2017/9/23.
 */
public class Task {
    //求二元数组的和
   public int total(int[][] Arr) {
       int total = 0;
       for (int index = 0; index < Arr.length; index++) {
           for (int viceIndex = 0; viceIndex < Arr[0].length; viceIndex++) {
               total += Arr[index][viceIndex];
           }
       }
       return total;
   }

   //对数组进行排序
    public void quickSort(int[]data,int min,int max){
        int pivot;
        if(min<max){
            pivot = partion(data,min,max);
            quickSort(data,min,pivot-1);
            quickSort(data,pivot+1,max);
        }
        for(int index=0;index<data.length;index++){
            System.out.println("  "+data[index]+"  ");
        }
       System.out.println();
    }
    private static int partion(int[] data,int min,int max){
        int partitionValue = data[min];
        int left = min ;
        int right = max;

        while (left<right){
            while (data[left] <= partitionValue && left<right){
                left++;
            }

            while (data[right] > partitionValue){
                right--;
            }

            if(left < right){
                swap(data,left,right);
            }

        }
        swap(data,min,right);
        return right;
    }

    private static void swap(int[] data, int index1, int index2){
        int temp = data[index1];
        data[index1]= data[index2];
        data[index2]= temp;
    }
    
    public boolean judge(int[] data){
        boolean judge=false;
        for(int index=0;index<data.length-1;index++){
            if(data[index+1]>data[index]){
                judge = true;
            }
        }
        return judge;
    }

    //获得数组的最大值和最小值
    public String Select(int[] arr){
        quickSort(arr,0,arr.length-1);
        return "Min Num in the array:"+arr[0]+" Max Num in the array:"+arr[arr.length-1];
    }
  

}

测试用例:TaskTest.java

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

/**
 * Created by Funny_One on 2017/9/23.
 */
public class TaskTest extends TestCase {
    private static final String TEST_FAILURE_MSG = "test fail";
    public static Test suite(){
        TestSuite suite=new TestSuite("Task测试程序");
        suite.addTestSuite(TaskTest.class);
        return  suite;
    }
    Task t = new Task();
    public void testTotal() throws Exception {
        int[][] Arr = {{1,2,3}};
        assertEquals(errorMsgTitle("The total is 6"),6,t.total(Arr));

    }

    public void testQuickSort() throws Exception {
        int[]data = {1,5,9,3,7};
        t.quickSort(data,0,4);
        assertEquals(errorMsgTitle("get true"),true,t.judge(data));
    }

    public void testSelect() throws Exception {
        int[] arr = {5,6,9,10,3,2,8,7};
        assertEquals(errorMsgTitle("get the min and max"),"Min Num in the array:"+2+" Max Num in the array:"+10,t.Select(arr));
    }

    private String errorMsgTitle(String msg){
        return msg+" "+ TEST_FAILURE_MSG;
    }
}

测试效果:

原文地址:https://www.cnblogs.com/VersionP1/p/7585843.html