一 目的
1、进一步掌握线性表顺序存储结构的定义及应用;
2、能够基于顺序表实现各种简单和先进排序方法。
3、能够应用排序算法解决实际问题。
二 内容
1、设一个含有 10 个任意整型数据元素的顺序线性表,分别使用简单选择排 序、冒泡以及快速排序算法对其进行排序,并对结果进行测试。
2、从键盘输入或从文件中读取有限个任意同类型的数据生成无序线性表, 并用直接插入排序方法、选择排序和堆排序方法对其进行排序;排序后,再从键 盘输入一个同类型的数据,插入后使线性表仍然有序,并对结果进行测试。
3、华清电脑销售公司是一家专门销售 ThinkPad 系列电脑的公司,每月均要 向总公司汇报不同型号电脑的销售情况,请运用相关知识实现对该公司不同型号 电脑销售情况进行排序,并形成汇总表。
4*、编写算法实现单链表上的选择排序,并对结果进行测试。
三 设计说明
1、冒泡排序:冒泡排序是一种交换排序,其的基本思想是:两两比较相邻记录 的关键字,如果反序则交换,直到没有反序的记录为止。
2、选择排序:简单选择排序法(Simple Selection Sort)就是通过 n-i 次关 键字间的比较,从 n-i+1 个记录中选出关键字最小的记录,并和第 i(1≤i≤n) 个记录交换之。
3、插入排序:直接插入排序(Straight Insertion Sort)的基本操作是将一 个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增 1 的有序 表。
4、希尔排序:我们将原本有大量记录数的记录进行分组。分割成若干个子序列, 此时每个子序列待排序的记录个数就比较少了,然后在这些子序列内分别进行直 接插入排序,当整个序列都基本有序时,注意只是基本有序时,再对全体记录进 行一次直接插入排序。
5、堆排序:堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的 方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的 最大值就是堆顶的根结点。将它与堆数组的末尾元素进行交换,此时末尾元素就 是最大值,然后将剩余的 n-1 个序列重新构造成一个堆,这样就会得到 n 个元素 中的次小值。如此反复执行,便能得到一个有序序列了。(大顶堆:在完全二叉 树中,每个结点的值都大于或等于其左右孩子结点的值)
6、归并排序:归并排序(Merging Sort)就是利用归并的思想实现的排序方法。 它的原理是假设初始序列含有 n 个记录,则可以看成是 n 个有序的子序列,每个 子序列的长度为 1,然后两两归 并,得到⌈n/2⌉(⌈x⌉表示不小于 x 的最小整数) 个长度为 2 的有序子序列;再两两归并,…… 如此重复,直至得到一 个长度为 n 的有序序列为止,这 种排序方法称为 2 路归并排序。
7、快速排序:快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录 分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小, 则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
四 功能说明
public int size(); //返回表长度
public void clear(); //重置为空表
public boolean isEmpty(); //若为空表返回 true,否则返回 false
public int get(int i); //返回第 i 个数据元素(返回类型可不同)
public int indexOf(int obj); //第 1 个与 obj 满足关系 equals()的数据元素位序,这
样的数据元素不存在,
public int getPre(int obj); //若 obj 是表中的元素,返回它的前驱
public int getNext(int obj); //若 obj 是表中的元素,返回它的后继
public void insertElementAt(int obj,int i); //在第 i 个位置之前插入新的数据元素
obj,表长度加 1
public int remove(int i); //删除第 i 个数据元素,并返回其值,表长减 1
public void printAll();
public void insertsort(); //直接插入排序
public void insertsort1(int x); //一趟插入排序将 x 插入线性表仍然有序
public int binarysearch(int x); //对有序表进行两分查找在下表 0 到 n 之间
public void bubblesort();//改进后的冒泡排序
}
package sj;
class SeqList implements ListIntf {
final int MAXSIZE=20; //线性表最大长度
public int[] elem; //存放线性表元素的数组
private int len; //线性表的长度