1. 程式人生 > >20172308 實驗三《程序設計與數據結構》查找與排序 實驗報告

20172308 實驗三《程序設計與數據結構》查找與排序 實驗報告

sorting 折半 相關 -m 缺少 新建 找不到 png 堆排

20172308 2018-2019-1 實驗3 《查找與排序》報告

課程:《程序設計與數據結構》
班級: 1723
姓名: 周亞傑
學號:20172308
實驗教師:王誌強
實驗日期:2018年10月20日
必修/選修: 必修

1.實驗內容

  • 查找與排序-1:定義一個Searching和Sorting類,並在類中實現linearSearch, SelectionSort方法
  • 查找與排序-2:重構代碼
  • 查找與排序-3:參考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中補充查找算法並測試
  • 查找與排序-4:補充實現課上講過的排序方法
  • 查找與排序-5:編寫Android程序對各種查找與排序算法進行測試

2. 實驗過程及結果

  • 查找與排序-1:
  1. 定義一個Searching和Sorting類
  2. 在類中實現linearSearch, SelectionSort方法
  3. 10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例數據中要包含自己學號的後四位
  4. 測試用例的選取要考慮到方法的形參,設計選取的用例
  5. 完成測試
  6. 結果截圖:
    技術分享圖片

技術分享圖片

  • 查找與排序-2:
  1. 重構代碼
  2. 把Sorting.java Searching.java放入 cn.edu.besti.cs1723.(姓名首字母+四位學號)包中
  3. 把測試代碼放test包中
  4. 重新編譯,運行代碼,提交編譯,運行的截圖(IDEA,命令行兩種)
  5. 結果截圖
    技術分享圖片
    技術分享圖片
  • 查找與排序-3:
  1. 參考http://www.cnblogs.com/maybe2030/p/4715035.html 在Searching中補充查找算法並測試
  2. 根據參考博客給的C++代碼,用Java完成方法的編寫
  3. 提交運行結果截圖
    技術分享圖片
    技術分享圖片
    技術分享圖片
    技術分享圖片
    技術分享圖片
  • 查找與排序-4:
  1. 補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)
  2. 測試實現的算法(正常,異常,邊界)
  3. 提交運行結果截圖
    技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

  • 查找與排序-5:
  1. 編寫Android程序對各種查找與排序算法進行測試
  2. 將方法類文件復制到Android studio中
  3. 根據需求設計界面,使能夠輸入數據,返回排序結果;輸入查找值,返回true或false
  4. 提交運行結果截圖
    技術分享圖片

技術分享圖片
技術分享圖片
技術分享圖片

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

  • 問題1:實驗3是根據參考博客裏的內容完成查找方法的編寫,比如沒有學過的斐波那契查找方法,但是博客裏只給了C++的代碼,在理解意思之後用Java寫出來。
    在寫二分查找代碼的時候,查找的結果出現了問題:如圖
    技術分享圖片

  • 問題1解決過程:
    (圖中的運行結果是不對的,但是代碼是修改之後的)
    測試運行的結果是輸出了0,這個很奇怪,輸出的應該是我要查找的數字才對
    然後對比參考博客裏給的C++代碼:
//二分查找(折半查找),版本1
int BinarySearch1(int a[], int value, int n)
{
    int low, high, mid;
    low = 0;
    high = n-1;
    while(low<=high)
    {
        mid = (low+high)/2;
        if(a[mid]==value)
            return mid;
        if(a[mid]>value)
            high = mid-1;
        if(a[mid]<value)
            low = mid+1;
    }
    return -1;
}

//二分查找,遞歸版本
int BinarySearch2(int a[], int value, int low, int high)
{
    int mid = low+(high-low)/2;
    if(a[mid]==value)
        return mid;
    if(a[mid]>value)
        return BinarySearch2(a, value, low, mid-1);
    if(a[mid]<value)
        return BinarySearch2(a, value, mid+1, high);
}

我用的是遞歸方法
二分查找是在有序的基礎上進行查找的:
參考博客給的方法需要傳進去查找的範圍,所以在找中間值的時候需要把下限加上
然後判斷中間值與要查的值大小關系
若正好相等,直接返回要查值的索引位置
若不相等,則對中間值加減1,然後到新的折半區域求新的中間值,判斷相等關系
......
如此遞歸下去

debug之後,發現問題所在:參考博客裏的代碼有點問題
方法是類似於上面所說的,但是每一次遞歸都缺少一次判斷:
即每一次遞歸,新的索引中間值都會增或減1,即缺少判斷中間值到達邊界的條件
如果要查找的值並不存在,則查到邊界的時候,就會越界

在博客的評論裏也有人回復了
技術分享圖片

加上條件之後即可

插值算法與二分查找類似,存在一樣的問題
代碼如下:

//插值查找
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 mid;
    if(a[mid]>value)
        return InsertionSearch(a, value, low, mid-1);
    if(a[mid]<value)
        return InsertionSearch(a, value, mid+1, high);
}

插值查找不再是一半一半的查找,而是根據所給查找的長度大小來分割查找的區域

修改後的代碼如下:

public static boolean InsertionSearch(Integer[] data, int min, int max, int target){
        boolean flag= false;
        int mid = min+(target-data[min])/(data[max]-data[min])*(max-min);

        if (mid <= max || mid >= min) {
            if (data[mid] == (target)) {
                flag = true;
            } else if (data[mid] > (target)) {//中間大於目標
                if (min <= mid - 1) {
                    flag = InsertionSearch(data, min, mid - 1, target);
                }
            } else if (data[mid] < target) {
                if (mid + 1 <= max) {
                    flag = InsertionSearch(data, mid + 1, max, target);
                }
            }
        }
        return flag;
    }

即也加入一行判斷,保證mid不會越界
這個也有人評論了
技術分享圖片

  • 問題2:實驗2的代碼重構,要求用命令行運行程序,很久沒有用Linux,已經忘得差不多了

  • 問題2解決過程:
    這個問題在實踐截止前也沒能解決,因為虛擬機的問題沒有在Ubuntu上測試運行
    於是在IDEA的命令行上試了很久,百度了很多參考博客,結果都沒能成功
    後來試了一下基本命令,如新建文件,ls等結果是——找不到命令(手動臉黑)
    這真是一個悲傷的故事
    百度了一下,應該跟IDEA的命令行相關配置有關

  • 問題3:在Android studio裏實現前四個實驗的功能,其間遇到了小問題

  • 問題3解決過程:
    第一個是將文件復制到Android studio裏面時,原先文件裏的import引用到這裏不能用了,因為AS裏已經有一些包結構了
    但是手動改的話會累死人的,因為這些查找用到了許多本書前幾章的代碼,懶得找,,,索性將所有文件都拷過去,所以說一個一個文件的改不現實
    所以根據包名,將這幾個實驗的代碼放進相應的包裏即可

4.感悟

本次實驗讓我意識到學過的只是應當多用多回顧,比如說Linux,Android studio,而不能學過就算了

20172308 實驗三《程序設計與數據結構》查找與排序 實驗報告