20202303 實驗七《資料結構與面向物件程式設計》實驗報告
# 20202303 2021-2022-1 《資料結構與面向物件程式設計》實驗一報告
課程:《程式設計與資料結構》
班級: 2023
姓名: 馬瀾
學號:20202303
實驗教師:王志強
實驗日期:2021年11月11日
必修/選修: 必修
## 1.實驗內容
-
定義一個Searching和Sorting類,並在類中實現linearSearch,SelectionSort方法,最後完成測試。
要求不少於10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例資料中要包含自己學號的後四位
提交執行結果圖。 -
重構你的程式碼
把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位學號) 包中(例如:cn.edu.besti.cs1823.G2301)
把測試程式碼放test包中
重新編譯,執行程式碼,提交編譯,執行的截圖(IDEA,命令列兩種) -
參考http://www.cnblogs.com/maybe2030/p/4715035.html ,學習各種查詢演算法並在Searching中補充查詢演算法並測試
提交執行結果截圖 -
實現排序方法等(至少3個)
測試實現的演算法(正常,異常,邊界)
提交執行結果截圖(如果編寫多個排序演算法,即使其中三個排序程式有瑕疵,也可以酌情得滿分) -
編寫Android程式對實現各種查詢與排序演算法進行測試
提交執行結果截圖
推送程式碼到碼雲(選做,額外加分)
-
## 2. 實驗過程及結果
(1)定義一個Searching和Sorting類,並在類中實現linearSearch,SelectionSort方法,最後完成測試。
要求不少於10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例資料中要包含自己學號的後四位
提交執行結果圖。
在進行排序設計時,可以採用類似“哨兵”思想,提高線性查詢效率,並設計測試各種情況下演算法的執行結果。相關的程式碼傳送到碼雲,以下展示測試情況,如圖。
(2)重構你的程式碼
把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位學號) 包中(例如:cn.edu.besti.cs1823.G2301)
把測試程式碼放test包中
重新編譯,執行程式碼,提交編譯,執行的截圖(IDEA,命令列兩種)
第一,將這兩個程式碼放入包中,一般可以滑鼠拖動,或者直接寫入程式,點選紅色小燈泡就可以建立包並且放入,如圖。
第二,重新編譯,執行程式碼,提交編譯,執行的截圖(IDEA)
第三,重新編譯,執行程式碼,提交編譯,執行的截圖(命令列),在這裡我重新寫了程式,而且進行了分開測試,所以每一個程式都有十個測試用例。
程式碼如下:
測試如下:
(3)參考http://www.cnblogs.com/maybe2030/p/4715035.html ,學習各種查詢演算法並在Searching中補充查詢演算法並測試
提交執行結果截圖
要實現查詢,對於之前的以及需要學習的出現好幾種,需要我們一一實現。
1.順序查詢:從資料結構線形表的一端開始,順序掃描,依次將掃描到的結點關鍵字與給定值k相比較,若相等則表示查詢成功;若掃描結束仍沒有找到關鍵字等於k的結點,表示查詢失敗。
2.二分查詢:也稱為是折半查詢,屬於有序查詢演算法。用給定值k先與中間結點的關鍵字比較,中間結點把線形表分成兩個子表,若相等則查詢成功;若不相等,再根據k與該中間結點關鍵字的比較結果確定下一步查詢哪個子表,這樣遞迴進行,直到查詢到或查詢結束髮現表中沒有這樣的結點。
3.插值查詢:也就是將上述的比例引數1/2改進為自適應的,根據關鍵字在整個有序表中所處的位置,讓mid值的變化更靠近關鍵字key,這樣也就間接地減少了比較次數。
4.斐波那契查詢:二分查詢的一種提升演算法,通過運用黃金比例的概念在數列中選擇查詢點進行查詢,提高查詢效率。
5.二叉樹查詢:二叉查詢樹是先對待查詢的資料進行生成樹,確保樹的左分支的值小於右分支的值,然後在就行和每個節點的父節點比較大小,查詢最適合的範圍。演算法中需要頻繁用到遞迴思想,需要注意基本情形的設定,避免無窮遞迴。
6.分塊查詢:將n個數據元素"按塊有序"劃分為m塊(m ≤ n)。每一塊中的結點不必有序,但塊與塊之間必須"按塊有序"。要做到塊與塊之間有序,可以自己手動設定界限,來將元素分塊。
7.鏈地址查詢:將全部具有同樣雜湊地址的而不同keyword的資料元素連線到同一個單鏈表中。假設選定的雜湊表長度為m,則可將雜湊表定義為一個有m個頭指標組成的指標陣列T[0..m-1]。凡是雜湊地址為i的資料元素,均以節點的形式插入到T[i]為頭指標的單鏈表中。而且新的元素插入到連結串列的前端,這不僅由於方便。還由於常常發生這種事實:新近插入的元素最優可能不久又被訪問。
8.線性查詢:線性探測法的地址增量di = 1, 2, ... , m-1,當中,i為探測次數。該方法一次探測下一個地址。知道有空的地址後插入。若整個空間都找不到空餘的地址,則產生溢位。
補充演算法截圖如下:
結果如下:
(4)實現排序方法等(至少3個)
測試實現的演算法(正常,異常,邊界)
提交執行結果截圖(如果編寫多個排序演算法,即使其中三個排序程式有瑕疵,也可以酌情得滿分)
我選擇的排序方法為堆排序,希爾排序,樹排序三個方法。
。希爾排序:把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止
。堆排序:堆是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點
。二叉樹排序:
(5)編寫Android程式對實現各種查詢與排序演算法進行測試
提交執行結果截圖
推送程式碼到碼雲(選做,額外加分)
對於安卓平臺的編寫以及製作如下,這次我選擇了Genymotion的小手機。
## 3. 實驗過程中遇到的問題和解決過程
- 問題1:在編寫第二個命令列的時候,一開始採用了IDEA自己的local自己進行java與javac的操作,然後一直彈錯誤,怎麼改都不對,麻了,如圖:
- 問題1解決方案:最後選擇了虛擬機器上命令列操作,雖然覺得有一絲絲變簡單了的意思,但沒辦法了,程式碼越改越亂,我怕了。
- 問題2:在進行虛擬機器操作時,由於我自己可能老了,記不住了,格式一直出錯,如圖:
- 問題2解決方案:上網搜了一下,直接javac之後換成java+檔名就行,不用寫java了。
- 問題3:在編寫遞迴方法的時候,程式在執行的時候反反覆覆,遞迴之後不發生變化。
- 問題3解決方案:最後看那個標準程式碼,發現自己少寫了mid的變化遞迴。這一步found很重要。
- 問題4:在虛擬安卓機的過程中,操作不太熟練來著,稍微動一動就標紅,寫出了一個好醜的佈局。
-問題4解決方案:唯手熟爾。
## 其他
感悟:感覺排序好難啊,尤其是程式碼,有時候就真的看不懂唄,而且安卓機真的難,我都建立好幾個了,都想罵人了。而且最近的實驗越來越難了,對我自己來說,真的有點痛苦,無語子。而且尤其是排序演算法和資料結構這一塊,還是不太熟練的樣子,希望下次繼續加油!!!
## 參考資料
- 《Java程式設計教程(第九版)》
- 《Java軟體結構與資料結構(第四版)》
- 網頁搜尋資料:https://blog.csdn.net/qq_26219679/article/details/79647221
- 網頁搜尋資料:https://blog.csdn.net/weixin_30384217/article/details/99115000