2017-2018 20162329 张旭升 实验报告:实验三

时间:2021-01-16 06:34:21

实验二:查找与排序

课程:程序设计与数据结构
班级: 1623
姓名: 张旭升
学号:20162329
指导教师:娄嘉鹏 王志强
实验日期:11月6日

实验密级: 非密级
预习程度: 已预习

必修/选修: 必修
实验序号: cs_29

实验名称: 查找与排序的应用,实现和分析

实验内容:

1. 已实现的排序方法测试

2. 已实现代码重构

3. 补充查找算法

4. 补充排序算法

5. Android实现排序查找

实验要求


1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程

  1. 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是 运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决 办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可 以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导

  2. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。


一、已实现排序方法测试

1.过程:

创建一个测试类,对之前所实现的所有排序方法统一进行测试,测试尽量要覆盖所有情况,例如测试对没有元素的数组进行排序,则会出现异常信息,然后对一个元素或多个元素测试,还有对正序逆序排序测试

2.测试结果:

2017-2018 20162329 张旭升 实验报告:实验三

3.测试代码链接

二、已实现代码重构

1. 要求:

把Sorting.java Searching.java放入 cn.edu.besti.cs1623.(姓名首字母+四位学号) 包中

把测试代码放test包中
重新编译,运行代码,提交编译,运行的截图

2. 运行截图:

2017-2018 20162329 张旭升 实验报告:实验三

3.代码链接

三、补充查找算法

1.斐波那契查找

斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。他要求开始表中记录的个数比某个斐波那契数小1,及n=F(k)-1;
开始将k值与第F(k-1)位置的记录进行比较(及mid=low+F(k-1)-1),比较结果也分为三种
  1)相等,mid位置的元素即为所求
  2)>,low=mid+1,k-=2;
  说明:low=mid+1说明待查找的元素在[mid+1,high]范围内,k-=2 说明范围[mid+1,high]内的元素个数为n-(F(k-1))= Fk-1-F(k-1)=Fk-F(k-1)-1=F(k-2)-1个,所以可以递归的应用斐波那契查找。
  3)<,high=mid-1,k-=1。

2.二叉树查找

二叉查找树有以下特点:
1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2)若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3)任意节点的左、右子树也分别为二叉查找树。
利用该特点在每次查找的时候都能将带查找元素排除一半的量,使得查找变得迅速。

3.分块查找

将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素
先选取各块中的最大关键字构成一个索引表;
查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。

4. 代码链接:

5.测试截图:

2017-2018 20162329 张旭升 实验报告:实验三
2017-2018 20162329 张旭升 实验报告:实验三

四、补充排序算法

1.希尔排序:

比较相隔较远距离(称为 增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。算法先将要排序的一组数按某个 增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当 增量减到1时,整个要排序的数被分成一组,排序完成。

2.堆排序:

堆是一种平衡二叉树的结构,最大堆和最小堆可以使得树的根最大或最小,又因为堆在每次取出根中元素时都会使得下一个最大或最小值来继任原来根的位置,然后一次一次的将根中的元素取出就可以得到一个有序的序列了

3.桶排序:

桶排序是一个典型的用空间换时间的算法,具体实现思想就是,首先分配一个比待排序数多得多的数组,我们都知道数组是一个线性结构,我们可以在该数组中建立待排序元素的索引,最后遍历这个数组按照索引的顺序输出就可以得到排序结果了。

4.二叉排序树:

在二叉排序树中(二叉查找树),之前我们就说二叉查找树有三个特点,在排序中我们也可以利用他的特点,即左树总是比根小,根总是比右树小的原则,将待排序数依次加入二叉排序树中,然后利用中序遍历输出就可以得到正确的排序结果了。

5.实现代码:

五、Android实现排序查找

#### 在这里我用之前实现的排序算法查找算法Contact类,用Android Studio编写了一个简单的APP来进行一些操作。

1.代码实现如下:

public class MainActivity extends AppCompatActivity {
TableLayout tableLayout;
Button OK,search;
EditText firstname,lastname,telephone;
Contact []arr;
ArrayList<Contact> list;
TextView fn,ln,tp;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tableLayout = (TableLayout) findViewById(R.id.TableLayout);
    OK = (Button) findViewById(R.id.OK);
    search = (Button) findViewById(R.id.search);
    firstname = (EditText) findViewById(R.id.firstname);
    lastname = (EditText) findViewById(R.id.lastname);
    telephone = (EditText) findViewById(R.id.telephone);
    list = new ArrayList<>();
    fn = (TextView) findViewById(R.id.fn);
    ln = (TextView) findViewById(R.id.ln);
    tp = (TextView) findViewById(R.id.tp);
    OK.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            list.add(new Contact(firstname.getText().toString(),lastname.getText().toString(),telephone.getText().toString()));
            arr = list.toArray(new Contact[list.size()]);
            Sorting.mergeSort(arr,0,arr.length-1);
            String A="",B="",C="";
            for(Contact i:arr){
                A += i.getFirstName()+"\n";
                B += i.getLastName()+"\n";
                C += i.getPhone()+"\n";
            }
            fn.setText(A);
            ln.setText(B);
            tp.setText(C);
        }
    });
    search.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Contact temp = (Contact)Searching.binarySearch(arr,new Contact(firstname.getText().toString(),lastname.getText().toString(),telephone.getText().toString()));
            fn.clearComposingText();
            ln.clearComposingText();
            tp.clearComposingText();
            fn.setText(temp.getFirstName());
            ln.setText(temp.getLastName());
            tp.setText(temp.getPhone());
        }
    });
}
}

3.实现截图:

2017-2018 20162329 张旭升 实验报告:实验三
2017-2018 20162329 张旭升 实验报告:实验三

六、实验总结

在本次实验中好多的程序算法都是我们没有接触过的,一些算法的实现都是在网上学习的,虽然实现了也还是有好多不懂的地方,后面还需要花些时间来深入学习一下。