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

posted @ 2021-11-12 12:09  20202306李金城  阅读(93)  评论(0编辑  收藏  举报