链表实现排序算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构
实
验
报
告
实验名称:实验三排序
学生姓名:
班级:
班内序号:15
学号:
日期:2016.12.19
1.实验要求
题目2
使用链表实现下面各种排序算法,并进行比较。
排序算法:
1、插入排序
2、冒泡排序
3、快速排序
4、简单选择排序
5、其他
要求:
1、测试数据分成三类:正序、逆序、随机数据
2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动
次数(其中关键字交换计为3次移动)。
3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精
确到微秒(选作)
4、对2和3的结果进行分析,验证上述各种算法的时间复杂度
编写测试main()函数测试线性表的正确性
2. 程序分析
2.1 存储结构
我使用了线性表的链式存储结构,通过建立双向循环链表进行顺序存取。每个节点分为data、next、previor。data域称为数据域,数据通过node结构存储待排序的信息;next为指针域,用来储存直接后继的地址;prior为指针域,用来储存直接前继的地址;
struct Node
{
int data;
struct Node*next;
struct Node*previor;
};
2.2 程序流程(或程序结构、或类关系图等表明程序构成的内容,一般为流
{
private:
Node* partion(Node*first,Node*end); //快速排序一趟
public:
Node*front;
int comparision; //比较次数
int movement; //移动次数
LinkList() //无参构造
{
front = new Node;
front->next = NULL;
front->previor = NULL;
comparision = movement = 0;
}
LinkList(int a[],int n); //构造函数:建立双向链表
void insertsort(); //插入排序
void bubblesort(); //冒泡排序
void Qsort(Node*x,Node*y); //快速排序
void selectsort(); //简单选择排序
void show(); //显示排序结果
~LinkList(); //析构函数
};
2.3 关键算法分析
构造函数:通过使用头插法建立双向链表,其关键是多设一个指针变量用于储存上一个末节点的地址,这样才能使节点指向其上一个节点。在这
次排序实验中,使用双向循环链表更方便进行遍历操作。LinkList::LinkList(int a[],int n)
{
front = new Node;
front->next = NULL;
front->previor = NULL;
comparision = movement = 0;
Node*x = new Node;
Node*s = new Node;
s->data = a[n - 1];
s->next = front;
s->previor = front;
front->next = s;
front->previor = s;
x = s;
for (int i = n - 2; i >= 0; i--)
{
Node*s = new Node;
s->data = a[i];
s->next = front->next;
s->previor = front;
front->next = s;
x->previor = s;
x = s;
}
}
插入排序函数:将front头节点当作哨兵。从第二个有效节点开始进行插入,进行边查找,边后移的操作。
void LinkList::insertsort()
{
Node*p = front->next;
Node*s = p->next;
while (s!=front)
{
if (s->data < p->data)
{
comparision++;
front->data = s->data;
movement++;
Node*x = p;
Node*y = s;
while (front->data < x->data)
{
comparision++;
y->data = x->data;
movement++;
x = x->previor;
y = y->previor;
}
y->data = front->data;
movement++;
}
comparision++;
p = p->next;
s = s->next;
}
}
冒泡排序函数:每一次内循环边比较边交换,将无序区中最大的数放入有序区中,并记录无序元素的范围。当无序元素指向front时即整体排序完
成。
void LinkList::bubblesort()
{
Node*s = front->previor; //初始化无序元素位置while (s != front)
{
Node*p = s; //本次无序元素位置
s = front;
Node*x = front->next;
Node*y = x->next;
while (x != p)
{
if (x->data > y->data)
{
comparision++;
front->data = x->data;
x->data = y->data;
y->data = front->data;