厦门理工学院数据结构实验2

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》实验报告

实验序号:2 实验项目名称:顺序表的实现

四、实验结果与数据处理

1.设A、B均为用数组实现的List类型的有序顺序表,试设计一个函数Alternate,从A、B读取值,构件数组C,使得C的值也有序。

要求:用不同的方式实现(至少两种),并比较算法的效率。

(1)运行结果:

图1:先合并之后再排序

图2:合并时排序

(2)问题分析:

在这一问题中,A顺序表和B顺序表的合并方法可以分为先将这两个顺序表合并后排序或者在输入时就对其进行比较元素大小排序。这里第一种方法,因为上一次实验学习过了快速排序,所以这一次我采用了另一种方法——希尔排序,希

尔排序法是对直接插入排序法的优化,通过设置一个增量,对原始序列进行分组,对每组用直接插入排序法排序再整合,再缩小增量,周而复始直至增量为1,完成排序,因此又叫“缩小增量排序法”。希尔排序的算法性能在面对大量数据时会高于快速排序,它的平均时间复杂度为n*log2n,整体范围为n^(1.3—2)之间。第二种方法是我们在输入时就对新顺序表进行排序,在输入A顺序表的时候我们正常接收数据,而在输入B顺序表时,我们通过遍历一次当前顺序表同时结合插入数据函数来将B顺序表输入的数据放到正确的位置上,来使整个顺序表能够有序,整体时间复杂度为n^2左右,可见第一种方法的算法效率会更高一些。

2.顺序表表示和实现线性表的如下:

【要求】(1)实现顺序表的插入、删除、按值查找等基本操作;

(2)假设构建的是非递增有序顺序表,设计算法实现从该有序顺序表中删除所有其值重复的元素,使得表中所有元素的值均不同。

(3)设有一元素为整数的线性表L=(a1,a2,a3,…,an),存放在一维数组A[N]中,设计一个算法,以表中an作为参考元素,将该表分为左、右两部分,其中左半部分每个元素小于等于an,右半部分每个元素都大于an, an位于分界位置上(要求结果仍存放在A[N]中)。

(4)分析以上算法的时间复杂性。

(1)运行结果:

图3:通过下标插入元素

图4:在头部插入元素图5:在尾部插入元素

图6:删除指定下标元素图7:删除所有元素

图8:删除指定元素图9:删除头元素

图10:按下标查找元素图11:按元素查找元素下标

(2)运行结果:

图12:删除所有重复元素(集合)

图13:删除指定元素的所有重复元素

(3)运行结果:

图14:A[N]左右分量

(4)算法时间复杂度分析:

大部分的增删查的算法时间复杂度都为O(n)级别,原理都是遍历一次顺序表找到相应元素并对其进行操作,在删除所有重复元素时,我采用了比较暴力的二重循环,时间复杂度较高为O(n2)级别。而在进行对A[N]分左右边界时我用了分治的思想,同时从左右两边进行遍历,交换那些不在所应该在的边界的值,所以算法时间复杂度应该低于O(n)级别。

五、分析与讨论

通过这一次实验我熟悉了顺序表的各种操作,同时也增加对顺序表的理解,更加能明白顺序存储结构的原理,同时在对程序优化的过程中也学会了其他一些算法,能够让程序的执行效率更高,也能适应各种情况,而我也明白了算法对于一个程序的重要性。

五、教师评语

成绩

签名:

日期:

附源程序清单:

1、2.

#include

#include

using namespace std;

constexpr auto MAXSIZE = 10;

#define Node ElemType

typedef int DataType;

class Node

{

public:

DataType data;

};

class SqList

{

public:

SqList();

~SqList();

void CreateSqList(int n);

void PrintSqList();

ElemType GetElemByIndex(int i);

bool isEmpty();

bool isFull();

int GetLength();

int GetElemByElem(DataType data);

void InsertSqList(int n, DataType data);

void InsertSqListAtHead(DataType data);

void InsertSqListAtEnd(DataType data);

void DeleteElem(int i);

void DeleteElemAtElem(DataType data);

void DeleteAll();

void DeleteAtHead();

void Sort();

void CombineSort1();

void CombineSort2();

void DelsameElem1();

void DelsameElem2(DataType data);

void DivElem();

private:

Node* elem;

int length;

SqList::SqList()

{

elem = new ElemType[MAXSIZE];

if (!elem) {

exit(OVERFLOW);

}

length = 0;

}

SqList::~SqList()

{

delete[] elem;

}

void SqList::CreateSqList(int n)

{

if (n < 0|| n > MAXSIZE) {

cout <<"输入的节点个数有误!"<< endl;

exit(EXIT_FAILURE);

}

else {

int i;

for (i = 0; i < n; i++) {

cout <<"请输入第"<< i + 1 <<"个节点元素: ";

cin >> elem[i].data;

}

length = n;

}

}

void SqList::PrintSqList()

{

for (int i = 0; i < length; i++) {

cout <<"第"<< i + 1 <<"个元素的值是"<< elem[i].data << endl;

}

}

相关文档
最新文档