1. 程式人生 > 實用技巧 >20192321 2020-2021-1 《資料結構與面向物件程式設計》實驗七報告

20192321 2020-2021-1 《資料結構與面向物件程式設計》實驗七報告

20192321 實驗七 《資料結構與面向物件程式設計》實驗報告

課程:《程式設計與資料結構》
班級:1923
姓名:李錦程
學號:20192321
實驗教師:王志強
實驗日期:2020年11月19日
必修/選修:必修

1.實驗內容

  • 1.定義一個Searching和Sorting類,並在類中實現linearSearch,SelectionSort方法,最後完成測試。
    要求不少於10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例資料中要包含自己學號的後四位
    提交執行結果圖。
  • 2.重構你的程式碼
    把Sorting.java Searching.java放入 cn.edu.besti.cs1823.(姓名首字母+四位學號) 包中(例如:cn.edu.besti.cs1823.G2301)
    把測試程式碼放test包中
    重新編譯,執行程式碼,提交編譯,執行的截圖(IDEA,命令列兩種)
  • 3.參考http://www.cnblogs.com/maybe2030/p/4715035.html ,學習各種查詢演算法並在Searching中補充查詢演算法並測試
    提交執行結果截圖
  • 4.補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)
    測試實現的演算法(正常,異常,邊界)
    提交執行結果截圖(如果編寫多個排序演算法,即使其中三個排序程式有瑕疵,也可以酌情得滿分)
  • 5.編寫Android程式對實現各種查詢與排序演算法進行測試
    提交執行結果截圖
    推送程式碼到碼雲(選做,加分)

2.實驗過程及結果

定義Searching和Sorting類並測試

Searching類

package cn.edu.besti.cs1923.G2321;

public class Searching
{

    public boolean order(int[] arr,int target){
        int i=0;
        int a = target;
        while(arr[i]!=target)
        {
            i++;
            if(i==arr.length)
                break;
        }
        return i==arr.length?false:true;
    }

    public void sort(int arr[]){
        for(int i =1;i<arr.length;i++) {
            for(int j=0;j<arr.length-i;j++) {
                if(arr[j]>arr[j+1]) {
                    int temp = arr[j];

                    arr[j]=arr[j+1];

                    arr[j+1]=temp;
                }
            }
        }
    }

    public boolean binary(int[] arr,int min,int max,int mid,int target){
        boolean found = false;
        mid = (min + max) / 2;
        int midd = mid;

        if(arr[midd]==target)
            found = true;
        else if (arr[midd]!=target)
        {
            if(target<arr[midd])
            {
                max = midd-1;
                midd--;
                found = binary(arr,min,max,midd,target);
            }
            else if(target>arr[midd])
            {
                min = midd+1;
                midd++;
                found = binary(arr,min,max,midd,target);
            }
        }
        return found;
    }

    public int binaryshow(int[] arr,int min,int max,int mid,int target){
        int found = 0;
        mid = (min + max) / 2;
        int midd = mid;

        if(arr[midd]==target)
            found = arr[midd];
        else if (arr[midd]!=target)
        {
            if(target<arr[midd])
            {

                max = midd-1;
                midd--;
                found = binaryshow(arr,min,max,midd,target);
            }
            else if(target>arr[midd])
            {
                min = midd+1;
                midd++;
                found = binaryshow(arr,min,max,midd,target);
            }
        }
        return found;
    }

    public int[] hash(int[] arr){
        int[] arr1 = {0,0,0,0,0,0,0,0,0,0,0,0};
        for(int i=0;i<arr.length;i++)
        {
            if(arr1[arr[i]%11] == 0)
                arr1[arr[i]%11] = arr[i];
            else
            {
                for(int j=2;j<arr.length;j++)
                    if(arr1[j-1] == 0)
                    {
                        arr1[j-1] = arr[i];
                        break;
                    }
            }
        }
        return arr1;
    }

    public int hashsearch(int[] result,int target){
        int k = target%11,i,re = 0;
        if(result[k]==target)
            re =  result[k];
        else
        {
            for(i=k;k<result.length;k++)
            {
                if(result[k]==target)
                {
                    re = result[k];
                    break;
                }
            }
        }
        return re;
    }

    public Linked[] linkedhash(Linked[] linked){
        Linked[] arr1 = new Linked[12];
        int i;
        for(i=0;i<12;i++)
            arr1[i] = new Linked(0);
        for(i=0;i<linked.length;i++)
        {
            if((arr1[linked[i].getnum()%11]).getnum() == 0)
                arr1[linked[i].getnum()%11] = linked[i];
            else
            {
                arr1[linked[i].getnum()%11].setNext(linked[i]);
            }
        }
        return arr1;
    }

    public int linkedsearch(Linked[] re1, int target){
        int k = target%11,i,re = 0;
        if(re1[k].getnum()==target)
            re = re1[k].getnum();
        else
        {
            Linked re2 = re1[k].getNext();
            //re2 = new Linked(0);
            if(re2.getnum()==target)
                re = re2.getnum();
        }
        return re;
    }

    public static boolean FibonacciSearch(int[] table, int keyWord) {
        //確定需要的斐波那契數
        int i = 0;
        while (getFibonacci(i) - 1 == table.length) {
            i++;
        }
        //開始查詢
        int low = 0;
        int height = table.length - 1;
        while (low <= height) {
            int mid = low + getFibonacci(i - 1);
            if (table[mid] == keyWord) {
                return true;
            } else if (table[mid] > keyWord) {
                height = mid - 1;
                i--;
            } else if (table[mid] < keyWord) {
                low = mid + 1;
                i -= 2;
            }
        }
        return false;
    }

    public static int getFibonacci(int n) {
        int res = 0;
        if (n == 0) {
            res = 0;
        } else if (n == 1) {
            res = 1;
        } else {
            int first = 0;
            int second = 1;
            for (int i = 2; i <= n; i++) {
                res = first + second;
                first = second;
                second = res;
            }
        }
        return res;
    }

    public static int InsertionSearch(int[] a, int value, int low, int high) {
        int mid = low + (value - a[low]) / (a[high] - a[low]) * (high - low);
        if (a[mid] == value)
            return a[mid];
        if (a[mid] > value)
            return InsertionSearch(a, value, low, mid - 1);
        else
            return InsertionSearch(a, value, mid + 1, high);
    }

    public static int blocking(int[] arr,int target){
        int[] ar1 = new int[arr.length];
        int[] ar2 = new int[arr.length];
        int[] ar3 = new int[arr.length];
        int i=0,j=0,k=0,l=0;
        int result = 0;
        for(i=0;i<arr.length;i++)
        {
            if(0<=arr[i]&&arr[i]<=20)
            {
                ar1[j] = arr[i];
                j++;
            }
            else if (20<arr[i]&&arr[i]<=60)
            {
                ar2[k] = arr[i];
                k++;
            }
            else
            {
                ar3[l] = arr[i];
                l++;
            }
        }
        i=0;
        if(0<=target&&target<=20)
        {
            for(i=0;i<ar1.length;i++)
                if(ar1[i]==target)
                {
                    result = ar1[i];
                    break;
                }
        }
        else if (20<target&&target<=60)
        {
            for(i=0;i<ar2.length;i++)
                if(ar2[i]==target)
                {
                    result = ar2[i];
                    break;
                }
        }
        else
        {
            for(i=0;i<ar3.length;i++)
                if(ar3[i]==target)
                {
                    result = ar3[i];
                    break;
                }
        }
        return result;
    }

    public static void ShellSort(int[] data)
    {
        int i= 0, temp = 0, j = 2;
        for (int incr = data.length / j; incr > 0; incr /= j)
        {
            for (int x = incr; x < data.length; x++)
            {
                temp = (int) data[x];
                for (i = x - incr; i >= 0; i -= incr)
                {

                    if (temp < (int) data[i])
                        data[i + incr] = data[i];
                    else
                        break;
                }
                data[i + incr] = temp;
            }
        }
    }

    public String print(int[] arr){
        String result = "";
        for(int i=0;i<arr.length;i++)
            result += ""+arr[i]+" ";
        return result;
    }
}

Sorting類

package cn.edu.besti.cs1923.G2321;

public class Sorting {


    public void selectionSort(int[] data)
    {
        int min=0;//記錄最小的數
        for(int i=0;i<data.length;i++)
        {

            for (int j=i+1;j<data.length;j++)
            {
                if(data[i]>data[j])
                {min=data[j];
                data[j]=data[i];
                data[i]=min;}

            }

        }
        for(int i=0;i<data.length;i++)
        {
            System.out.println("test"+"["+i+"]"+": "+data[i]);
        }
    }
    public void insertSort(int []data)
    {
        int temp;
        int j ;
        for(int i=1;i<data.length;i++)
        {
            temp=data[i];//待插入的數
            for ( j=i-1;j>=0&&data[j]>=temp;j--)
            {
                data[j+1]=data[j];
            }
            data[j+1]=temp;

        }
        for(int i=0;i<data.length;i++)
        {
            System.out.println("test"+"["+i+"]"+": "+data[i]);
        }
    }

    public  void shellSort(int[] data)
    {
        int j = 0;
        int temp = 0;
        //每次將步長縮短為原來的一半
        for (int increment = data.length / 2; increment > 0; increment /= 2)
        {
            for (int i = increment; i < data.length; i++)
            {
                temp = data[i];
                for (j = i; j >= increment&&temp <data[j - increment]; j -= increment)
                {
                    data[j] = data[j - increment];
                }
                data[j] = temp;
            }

        }
        for(int i=0;i<data.length;i++)
        {
            System.out.println("test"+"["+i+"]"+": "+data[i]);
        }
    }

}

測試類

package cn.edu.besti.cs1923.G2321;

import java.util.Scanner;

public class SearchRunTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        Searching asl = new Searching();
        int target = 0,i,j=0;

        int[] arr = {20,19,23,21,68,20,84,27,55,11,10,79};
        System.out.println("列表:");
        System.out.println(asl.print(arr));

/*        asl.sort(arr);
        System.out.println("排序:"+asl.print(arr));*/

/*        System.out.println("順序查詢,輸入要查詢的數:");
        target = scan.nextInt();
        System.out.println("是否找到:"+asl.order(arr,target));
        target = scan.nextInt();
        System.out.println("是否找到:"+asl.order(arr,target));*/

        System.out.println("折半查詢,輸入要查詢的數:");
        target = scan.nextInt();
        System.out.println("是否找到:"+asl.binary(arr,0,11,5,target));
        System.out.println("找到的數是:"+asl.binaryshow(arr,0,11,5,target));

/*        System.out.println("線性探查法查詢,輸入要查詢的數:");
        target = scan.nextInt();
        int result[] = asl.hash(arr);
        int re = asl.hashsearch(result,target);
        if(re==0)
            System.out.println("查詢失敗!陣列中無此數!");
        else
            System.out.println("查詢成功!查詢到的數是:"+re);*/


/*        System.out.println("二叉排序樹查詢,輸入要查詢的數:");
        int a = scan.nextInt();
        Compareable target1;
        target1 = new Compareable(a);
        int[] b = new int[12];
        BinaryTree e=new BinaryTree();
        e.s(arr);
        Compareable tree = e.get();
        boolean k = treesearch.erchashu(tree,target1);
        System.out.println("是否找到:"+k);*/

/*        System.out.println("鏈地址法查詢,輸入要查詢的數:");
        target = scan.nextInt();
        Linked[] linked = new Linked[12];
        for(i=0;i<12;i++)
            linked[i] = new Linked(arr[i]);
        Linked[] re1 = asl.linkedhash(linked);
        int ree = asl.linkedsearch(re1,target);
        if(ree==0)
            System.out.println("查詢失敗!陣列中無此數!");
        else
            System.out.println("查詢成功!查詢到的數是:"+ree);*/

/*        System.out.println("插值查詢,輸入要查詢的數:");
        target = scan.nextInt();
        asl.sort(arr);
        System.out.println("查詢到的數是:"+asl.InsertionSearch(arr,target,0,11));*/

/*        System.out.println("斐波那契查詢,輸入要查詢的數:");
        target = scan.nextInt();
        System.out.println("是否找到:"+asl.FibonacciSearch(arr,target));*/

/*        System.out.println("分塊查詢,輸入要查詢的數:");
        target = scan.nextInt();
        int re1 = asl.blocking(arr,target);
        if(re1==0)
            System.out.println("查詢失敗!陣列中無此數!");
        else
            System.out.println("查詢成功!查詢到的數是:"+re1);
        target = scan.nextInt();
        int re2 = asl.blocking(arr,target);
        if(re2==0)
            System.out.println("查詢失敗!陣列中無此數!");
        else
            System.out.println("查詢成功!查詢到的數是:"+re2);*/
    }
}

執行結果截圖










3.實驗過程中遇到的問題和解決過程

  • 問題1:不能理解雜湊查詢的方法
  • 問題1解決方案:CSDN上查詢相關教程

其他(感悟、思考等)

在這次實驗過程中,我遇到了許多問題,其中既有知識上的漏洞,也有不細心導致的馬虎,這一切都補充,完善,豐富,擴充套件了我的計算機知識體系。在這個過程中,我還進一步熟悉了IDEA這個平臺的使用與執行方式,提高了自己自主學習的能力,為我接下來學習資料結構以及JAVA語言程式設計打下了堅實的基礎,並在不斷探索的過程中逐步提升了自己。

參考資料