1. 程式人生 > 其它 >20202306 實驗七 《查詢與排序》

20202306 實驗七 《查詢與排序》

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

課程:《程式設計與資料結構》
班級: 2023
姓名: 李金城
學號:20202306
實驗教師:王志強
實驗日期:2021年11月12日
必修/選修: 必修

## 1.實驗內容

  1. 定義一個Searching和Sorting類,並在類中實現linearSearch,SelectionSort方法,最後完成測試。
    要求不少於10個測試用例,提交測試用例設計情況(正常,異常,邊界,正序,逆序),用例資料中要包含自己學號的後四位
    提交執行結果圖。

  2. 重構你的程式碼
    把Sorting.java Searching.java放入 cn.edu.besti.cs2023.(姓名首字母+四位學號) 包中(例如:cn.edu.besti.cs1823.G2301)
    把測試程式碼放test包中
    重新編譯,執行程式碼,提交編譯,執行的截圖(IDEA,命令列兩種)

  3. 參考http://www.cnblogs.com/maybe2030/p/4715035.html ,學習各種查詢演算法並在Searching中補充查詢演算法並測試
    提交執行結果截圖

  4. 實現排序方法等(至少3個)
    測試實現的演算法(正常,異常,邊界)
    提交執行結果截圖(如果編寫多個排序演算法,即使其中三個排序程式有瑕疵,也可以酌情得滿分)

  5. 編寫Android程式對實現各種查詢與排序演算法進行測試
    提交執行結果截
    推送程式碼到碼雲(選做,額外加分)

## 2. 實驗過程及結果 1.定義一個Searching和Sorting類,並在類中實現linearSearch,SelectionSort方法,最後完成測試

碼雲連結:https://e.gitee.com/besti-cs/repos/besti-cs/ljc20202306_Java/blob/bin/src/Sorting.java

      https://e.gitee.com/besti-cs/repos/besti-cs/ljc20202306_Java/blob/bin/src/Searching.java

2.重構你的程式碼

3. & 4.參考http://www.cnblogs.com/maybe2030/p/4715035.html ,學習各種查詢演算法並在Searching中補充查詢演算法並測試;實現排序方法等(至少3個)測試實現的演算法(正常,異常,邊界)

  public class Fibonacci {
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();
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 String print(int[] arr){
String result = "";
for(int i=0;i<arr.length;i++)
result += ""+arr[i]+" ";
return result;
}
}

5.編寫Android程式對實現各種查詢與排序演算法進行測試

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


- 問題1:程式碼輸入的時候,會關聯到其他類的內容,產生錯誤(主要集中在引數型別不匹配)。
- 問題1解決方案:查詢到存在該方法的類,修改括號內參數,並調整。
- 問題2:Andriod Studio中Haxm下載失敗。
- 問題2解決方案:查詢華為客服後,原因在於軟體不適配,因此更換其他安卓虛擬機器生成器。

## 其他(感悟、思考等)


  排序結構操作方法多樣,但結果都是相同的,因此才有探索的意義和興趣,這需要極強的耐心和良好的邏輯思維能力。對於不懂的問題一定要存疑多問,切忌閉門造車,自以為是。


## 參考資料

- [《Java和Andriod開發學習指南(第二版)人民郵電出版社》]

- [《Java軟體結構與資料結構(第三版)清華大學出版社》]

- https://www.cnblogs.com/maybe2030/p/4715035.html