20172305 2017-2018-2 《程序設計與數據結構》實驗三報告

20172305 2017-2018-2 《程序設計與數據結構》實驗三報告

課程:《程序設計與數據結構》
班級: 1723
姓名: 譚鑫
學號:20172305
實驗教師:王志強
實驗日期:2018年11月21日
必修/選修: 必修html

1.實驗內容

  • 實驗三-1-查找和排序:
    • (1)定義一個Searching和Sorting類,並在類中實現linearSearch(教材P162 ),SelectionSort方法(P169),最後完成測試。
    • (2)要求很多於10個測試用例,提交JUnit測試用例設計狀況(正常,異常,邊界,正序,逆序),用例數據中要包含本身學號的後四位
  • 實驗三-2-查找和排序:
    • (1)重構你的代碼把Sorting.java Searching.java放入cn.edu.besti.cs1723.(姓名首字母+四位學號)包中(例如:cn.edu.besti.cs1723.G2301)把測試代碼放test包中從新編譯,運行代碼,提交編譯,運行的截圖(IDEA,命令行兩種)
  • 實驗三-3-查找和排序:
    • (1)參考 在Searching中補充查找算法並測試
  • 實驗三-4-查找和排序:
    • (1)補充實現課上講過的排序方法:希爾排序,堆排序,二叉樹排序等(至少3個)測試實現的算法(正常,異常,邊界)提交運行結果截圖
  • 實驗三-5-查找和排序(選作):java

    • (1)編寫Android程序對各類查找與排序算法進行測試

2. 實驗過程及結果

  • 實驗三-1-查找和排序:測試選擇排序和順序查找兩個方法,其實很簡單,相關代碼以前都寫過或是書上都有,可是要用到JUnit測試,正常寫個驅動類就好,可是非要用到JUnit測試,只能找回婁老師的博客和本身上學期的實驗二博狂補。git

    • 排序的測試:
    • 查找的測試:
  • 實驗三-2-查找和排序:將已有的類移動到一個新的包內實現代碼的重構,簡單的建立移動就好,可是須要在命令行下完成。瞬間炸裂,好在本身在實驗室一直用的是Linux系統進行編譯仍是很簡單的。可是,包名很長,在建立的時候總會是爆紅,好在只是提醒,否則實驗作不成了。在虛擬機建立的過程很簡單,可是在運行的時候總會有問題,非安全操做...一樣的代碼在IDEA上就能夠運行的,放到虛擬機裏面就會有問題,很神奇。在校對了好幾遍代碼才發現有一行聲明包名的代碼,刪掉就好。嘗試在虛擬機上進行JUnit測試,發現代碼不能正常運行就改成正常的編寫驅動類進行測試。算法

    • 包名的提示:

      命令行操做:

  • 實驗三-3-查找和排序:根據博客上的查找方法在Searching內進行補充去其餘查找方法,斐波那契查找(不是一個斐波那契數列麼?)、二叉樹查找、分塊查找、哈希查找等。好在有博客支持,經過網上的資源實現了相關代碼(具體代碼會在問題中進行分析),在作這個實驗的時候,始終在二分查找出有問題,一直沒有解決,後來忽然發現是二分查找要求是排序後的數組,而不是像順序查找同樣能夠隨便查找,仍是知識記得不牢固,致使在這種問題上卡殼。數組

  • 實驗三-4-查找和排序:在Sorting中補充希爾排序,堆排序,二叉樹排序等方法。堆排序是在堆部分實現的,二叉樹排序就是用個AVL樹就能夠,不斷比較添加元素的大小造成AVL樹,最後能夠在AVL樹進行中序輸出就能夠,希爾排序也是以前作過的直接進行整合就能夠。安全

  • 實驗三-5-查找和排序:(選作):在ANdroid實現相關代碼的運行。數據結構

    • 主界面(有點low...)
    • 查找界面:
    • 排序界面:
  • 全部代碼:
  • 問題1:針對老師給出的測試狀況,我對邊界狀況和異常狀況進行的疑惑?如何測試邊界狀況,是肯定邊界正確仍是邊界錯誤?以異常狀況是指什麼類型的異常?能夠出如今建立數組、也能夠在某些查找以前未進行排序、仍是查無此物?
  • 問題1的解決方案:感受均可以,個人猜測都滿合理的。因此,針對邊界狀況我嘗試了在縮短邊界範圍查找超出邊界的元素和範圍內的元素,針對異常狀況我嘗試查找未存在的元素以及未進行排序就進行的查找,可是我以爲建立數組時的錯誤不該該算在方法的測試,應該算在編寫過程出現的錯誤。命令行

  • 問題2:斐波那契查找?
  • 問題2的解決方案:斐波那契是二分法的改進版,和折半查找相似。不一樣的是它利用了數學領域的黃金分割法則(也就是0.618法則),避免了死板的二分法則。設計

    • 斐波那契查找的核心是:
    • 1.0當k=a[mid]時,查找成功;
    • 2.當k<F[mid]時,新的查找範圍是第low個到第mid-1個,此時範圍個數爲F[k-1] - 1個,即數組左邊的長度,因此要在[low, F[k - 1] - 1]範圍內查找;
    • 3.當k>a[mid]時,新的查找範圍是第mid+1個到第high個,此時範圍個數爲F[k-2] - 1個,即數組右邊的長度,因此要在[F[k - 2] - 1]範圍內查找。
    while (low <= high) {
              // low:起始位置
              // 前半部分有fibonacci[temp1 - 1]個元素(斐波那契數組【temp1 - 1】),因爲索引值從0開始
              // 則-1 獲取 黃金分割位置元素的索引值
              mid = low + fibonacci[temp1 - 1] - 1;
              if (temp[mid] > (int)target) {
                  // 查找前半部分,指針移動
                  high = mid - 1;
                  // (所有元素) = (前半部分)+(後半部分)
                  // fibonacci[temp1] = fibonacci[temp1 - 1] + fibonacci[temp1 - 1]
                  // 由於前半部分有fibonacci[temp1 - 1]個元素,因此 k = k-1
                  temp1 = temp1 - 1;
              } else if (temp[mid] < (int)target) {
                  // 查找後半部分,指針移動
                  low = mid + 1;
                  // (所有元素) = (前半部分)+(後半部分)
                  // fibonacci[temp1] = fibonacci[temp1 - 1] + fibonacci[temp1 - 1]
                  // 由於後半部分有fibonacci[temp1 - 1]個元素,因此 temp1 = temp1 - 2
                  temp1 = temp1 - 2;
              } else {
                  // 若是爲真則找到相應的位置
                  if (mid <= high) {
                      return mid + 1;
                  } else {
                      // 出現這種狀況是查找到補充的元素
                      // 而補充的元素與high位置的元素同樣
                      return high + 1;
                      }
              }
          }

其餘

實驗三不像實驗二那麼複雜,就是一個整合排序和查找的實現,也同時溫習了命令行運行的模式和JUnit測試。

參考資料

相關文章
相關標籤/搜索