链表实现排序算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档