zoukankan      html  css  js  c++  java
  • 2020软件工程作业04

    2018软件工程 https://edu.cnblogs.com/campus/zswxy/2018SE
    这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/2018SE/homework/11406
    这个作业的目标 算法与数据结构
    学号 20189666

    第一题:

    题目名称

    题目是寻找数组中第K大数 考察算法:排序算法

    解题思路

    使用C语言,
    先手动实现一个排序算法,我手动实现了一个C语言的选择排序.
    其次用printf和scanf输入和输出,数组的索引是从0开始,所以要在索引数组的时候要改下.
    最后输出索引时,需要将索引+1输出,才是需要的索引.

    解题代码

    #include <stdio.h>
    
    void swap(int *a,int *b) //交換兩個變數
    {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    int * SortArrBySelect ( int arr[],int arr_len)
    {
        int i,i2;
        int maxIndex,start;
        int end = arr_len -1;
        for (i = 0;i< end;i++){
            maxIndex = i;
            start = maxIndex + 1;
            for(i2 = start;i2<arr_len;i2++)
    //             遍历未排序的数组
             {
                int arrBymaxIndex = arr[maxIndex];
                int arrByi2 = arr[i2];
    //             找到arr[i2:]以后的最小索引
                if(arrByi2 >arrBymaxIndex){
                  maxIndex = i2;
                 }
             }
    //         将arr[minIndex]和arr[i]元素交换
             swap(&arr[maxIndex], &arr[i]);   
            
    //         printf("=====================
    ");
            
    //         printf("%d=%d-%d
    ",arr[minIndex],arr[i],arr[minIndex]);
    //         arr[minIndex] =  arr[i] - arr[minIndex]; 
    
    //         printf("%d=%d-%d
    ",arr[i],arr[i],arr[minIndex]);
    //         arr[i] = arr[i] - arr[minIndex];
    
    //         printf("%d=%d-%d
    ",arr[minIndex],arr[minIndex],arr[i]);
    //         arr[minIndex] = arr[minIndex] + arr[i];
            
    //         printf("=====================
    ");
            
        }
        return arr;
    }
    
    int Find( int arr[],int arr_len,int value)
    {
        int i;
        int arrByi;
        for(i=0;i< arr_len;i++){
            arrByi=arr[i];
            if(arrByi == value){
                return i;
            }
        }
        return -1;
    }
    
    void PrintArray(int arr[],int arr_len)
    {
       printf("
    ");
       
       int i;
         for (i = 0; i < arr_len; i++)
    	{
    		printf("%d ", arr[i]);
    	} 
       printf("
    ");
        
    }
    
    int main()
    {
       int arr_len;
       scanf("%d", &arr_len); 
       int arr[arr_len];
       
       int i; 
       for (i = 0; i < arr_len; i++)
    	{
    		scanf("%d", &arr[i]);
    	} 
    
        
        
       
        
        
       int question_arr_len1; 
       int question_arr_len2=3;
    //    输入询问数组
       scanf("%d",&question_arr_len1);
       
       int question_arr[question_arr_len1][question_arr_len2];
       int i2 = 0;
    //    每行3个数,输入question_arr_len行
       for (i = 0; i < question_arr_len1; i++)
    	{
           for (i2 = 0; i2 < question_arr_len2; i2++)
           {
                scanf("%d", &question_arr[i][i2]);
            }  
    	}  
       int answer_arr[question_arr_len1];
        int * arrAfterSoft;
        for (i = 0; i < question_arr_len1; i++)
    	{
           int start = question_arr[i][0]-1;
           int end = question_arr[i][1]-1;
           int keyIndex = question_arr[i][2]-1;
           int tempArr_len = end-start+1;
           int tempArr[tempArr_len];
           
           for (i2 = start; i2 < tempArr_len; i2++)
           {
                tempArr[i2]=arr[i2];
            }
    
           
    
            
            
           arrAfterSoft=SortArrBySelect(tempArr,tempArr_len);
         
    //        printf("第 %d 大的值是: %d",keyIndex,arrAfterSoft[keyIndex-1]);
           answer_arr[i]=Find(arr,arr_len,arrAfterSoft[keyIndex])+1;
            
    	}  
    
    
    
       
       return 0;
    }
    

    运行测试结果如下

    第二题

    题目名称:

    题目名称是:二叉树的先、中、后 序遍历与层级遍历 考察算法: dfs + bfs搜索算法

    解题思路

    根据先序中序后序层次遍历的定义,使用Java语言实现三种方法.

    解题代码

    import java.util.LinkedList;
    public class BinaryTreeDemo {
        public static void main(String[] args) {
            /*
                作业要求:叉树的先、中、后 序遍历与层级遍历
                自己实现四个方法,main方法中调用,将结果打印到控制台
             */
            /*  二叉树的结构
                         A
                        / 
                       T   6
                      /
                     D
                   /   
                  N     5
                 /     /
                B   4  1
                     
                      9
             */
            Node root = into();
            // 先序遍历
            System.out.println("
    "+"前序遍历");
            A(root);
            // 中序遍历
            System.out.println("
    "+"中序遍历");
            B(root);
            // 后续遍历
            System.out.println("
    "+"后续遍历");
            C(root);
            // 层级遍历
            System.out.println("
    "+"层级遍历");
            D(root);
    
        }
    
        private static void A(Node node) {
            // TODO 先序遍历
            System.out.print(node.data + "	");
            if(node.l != null){
                A(node.l);
            }
            if(node.r != null){
                A(node.r);
            }
    
        }
        private static void B(Node node) {
            // TODO 中序遍历
            if(node.l != null){
                B(node.l);
            }
            System.out.print(node.data + "	");
            if(node.r != null){
                B(node.r);
            }
        }
        private static void C(Node node) {
            // TODO 后续遍历
            if(node.l != null){
                C(node.l);
            }
            if(node.r != null){
                C(node.r);
            }
            System.out.print(node.data + "	");
        }
    
        private static void D(Node node) {
            // TODO 层级遍历
            if(node == null) {
                return ;
            }
            LinkedList<Node> queue = new LinkedList<>();
            Node current = null;
            queue.offer(node);
            while(!queue.isEmpty()) {
                current = queue.poll();//出队队头元素并访问
                System.out.print(current.data+ "	");
                if(current.l != null) { //如果当前节点的左节点不为空入队
                    queue.offer(current.l);
                }
                if(current.r != null) {//如果当前节点的右节点不为空,把右节点入队
                    queue.offer(current.r);
                }
            }
        }
    
        // 构建一颗树,返回根节点
        private static Node into(){
            Node root = new Node("A");
            Node node1 = new Node("T");
            Node node2 = new Node("D");
            Node node3 = new Node("N");
            Node node4 = new Node("B");
            Node node5 = new Node("6");
            Node node6 = new Node("5");
            Node node7 = new Node("4");
            Node node8 = new Node("9");
            Node node9 = new Node("1");
            root.l = node1;
            node1.l = node2;
            node2.l = node3;
            node2.r = node6;
            node3.r = node7;
            node7.r = node8;
            node6.l = node9;
            node3.l = node4;
            root.r = node5;
            return root;
        }
    
        // 节点
        static class Node{
            // 数据
            Object data;
            // 左孩子
            Node l;
            // 右孩子
            Node r;
    
            public Node(){}
    
            public Node(Object data) {
                this.data = data;
                this.l = null;
                this.r = null;
            }
    
            public Node(Object data, Node l, Node r) {
                this.data = data;
                this.l = l;
                this.r = r;
            }
        }
    }
    

    运行结果:

  • 相关阅读:
    结婚很难
    ***归心似箭***
    听首你家健和我家菲都唱过的歌吧
    努力幸福
    080509
    快速切题 poj1573
    POJ 2586 Y2K Accounting Bug 贪心 难度:2
    快速切题 poj2632
    POJ 3579 median 二分搜索,中位数 难度:3
    HDU 4802 && HDU 4803 贪心,高精 && HDU 4804 轮廓线dp && HDU 4805 计算几何 && HDU 4811 (13南京区域赛现场赛 题目重演A,B,C,D,J)
  • 原文地址:https://www.cnblogs.com/TheFaceOfAutumnWhenSummerEnd/p/13878680.html
Copyright © 2011-2022 走看看