javascript实现链表插入排序和列表合并排序

javascript实现链表插入排序和列表合并排序
本文详细描述了javascript链插入排序和列表合并排序的实现,合并排序表是对每个部分进行合并和排序,然后将其合并在一起。
1。链表
1.1个链表的存储表示

清单存储
Typedef int ElemType;
结构中结点的定义
{
数据域;
Struct LNode *下;
} LNode * LinkList;
1.2基本操作
创建列表:

*
*创建链表。
*参数编号是链表的长度,函数返回链表的头指针。
* /
LinkList CreatLink(int num)
{
数据i;

p指向当前列表中的最后一个节点,q指向准备插入的节点。
链表的头= null,P = null,Q;

对于(i = 0;i <;;i + +)
{
Scanf(%d
Q =(链表)malloc(sizeof(LNode));
q =数据=数据;
q =下一个null;
如果(i = 0)
{
头= q;
}
其他的
{
p =下一个q;
}
p=q;
}
返回头;
}
输出链表:

*
*输出链表节点值。
* /
Int PrintLink(链表的头)
{
链表的P;
为(P =头;P;P = P -下)
{
printf(% 3D
}
返回0;
}
2。链表插入排序
基本思想:假设前面的n-1个节点是有序的,N个节点被插入到前面节点的适当位置以使n个节点按顺序排列。
实现方法
在链表的第一个节点被删除,变成一个链表包含一个节点(head1),和剩余的节点成为另一个链表的自然(head2),当head1包含。

一个有序的节点列表;
在链表head2第一节点被插入到列表中head1适当位置,使head1仍然有序。head1变得有序列表包含两个节点。
反过来,一个节点从链表中删除,head2插入链表head1 head2直到列表为空列表。最后,链表head1包含所有节点和节点为。
插入排序代码:

*
*列表插入排序(增加)。
*输入:链表的头指针,
*输出:排序列表的头指针。
*实现方法:拆除原列表分为两部分:清单1仍然采用头部为头指针和链表节点有序。列表2以head2为头指针和链表节点是无序的。
*将链表2中的节点插入链表1中,并将清单1按顺序排列。
*最后一个链表1包含所有的节点并进行排序。
* /
LinkList LinkInsertSort(链表的头)
{
当前点指向要插入的当前节点。
head2链表,电流,P,Q;

如果(头= NULL)
返回头;

第一个拆分。
head2 =头->下;
头>下一个=空;

而(head2)
{
电流= head2;
head2 = head2 ->下;

查找插入位置,为中间节点P和Q插入位置。
对于(p = NULL,q =头;Q Q - >数据数据;P = Q,Q = Q -下一步);

如果(q =头)
{
将当前插入到前面。
头=电流;
}
其他的
{
p =下一个=当前;
}
当前>下一个= q;
}
返回头;
}
完整源代码:

*
*列表插入排序,从小到大
* /
#定义_crt_secure_no_warnings
#包括
#包括

#定义总 / / 10链长度

清单存储
Typedef int ElemType;
结构中结点的定义
{
数据域;
Struct LNode *下;
} LNode * LinkList;

LinkList CreatLink(int num);
LinkList LinkInsertSort(链表的头);
Int PrintLink(链表的头);

*
*创建链表。
*参数编号是链表的长度,函数返回链表的头指针。
* /
LinkList CreatLink(int num)
{
数据i;

p指向当前列表中的最后一个节点,q指向准备插入的节点。
链表的头= null,P = null,Q;

对于(i = 0;i <;;i + +)
{
Scanf(%d
Q =(链表)malloc(sizeof(LNode));
q =数据=数据;
q =下一个null;
如果(i = 0)
{
头= q;
}
其他的
{
p =下一个q;
}
p=q;
}
返回头;
}

*
*列表插入排序(增加)。
*输入:链表的头指针,
*输出:排序列表的头指针。
*实现方法:拆除原列表分为两部分:清单1仍然采用头部为头指针和链表节点有序。列表2以head2为头指针和链表节点是无序的。
*将链表2中的节点插入链表1中,并将清单1按顺序排列。
*最后一个链表1包含所有的节点并进行排序。
* /
LinkList LinkInsertSort(链表的头)
{
当前点指向要插入的当前节点。
head2链表,电流,P,Q;

如果(头= NULL)
返回头;

第一个拆分。
head2 =头->下;
头>下一个=空;

而(head2)
{
电流= head2;
head2 = head2 ->下;

查找插入位置,为中间节点P和Q插入位置。
对于(p = NULL,q =头;Q Q - >数据数据;P = Q,Q = Q -下一步);

如果(q =头)
{
将当前插入到前面。
头=电流;
}
其他的
{
p =下一个=当前;
}
当前>下一个= q;
}
返回头;
}

*
*输出链表节点值。
* /
Int PrintLink(链表的头)
{
链表的P;
为(P =头;P;P = P -下)
{
printf(% 3D
}
返回0;
}

主()
{
链表的头;

printf(输入总数量创建链表:;
头= CreatLink(总);

头= LinkInsertSort(头);
printf(排序后:);
PrintLink(头);
Putchar(');
返回0;
}

三.链表合并排序
基本思想:如果链表是空的或包含一个节点,那么链表是自然有序的,否则,链表被分成两部分,每个部分进行排序和排序,然后将两个链表组合在一起。
归并排序码:

*
*列表合并排序(升序)。
*输入:链表的头指针,
*输出:排序列表的头指针。
*递归实现方法:链表头分为两部分,合并排序分别进行,排序后的两部分合并在一起。
*递归终止条件:递归排序列表的列表为空或只有一个节点。
* /
LinkList LinkMergeSort(链表的头)
{
head1链表,head2;
如果(头空头->下一| | = = = = null)
返回头;

LinkSplit(头、head1,head2);
head1 = LinkMergeSort(head1);
head2 = LinkMergeSort(head2);
头= LinkMerge(head1,head2);
返回头;
}
链表的分区函数如下所示。基本思想是使用慢/快指针,具体实现方法是查看注释。

*
*链表分配函数。
*链表的头被分为两部分head1和head2,如果链的长度是奇数,多节点从第一部分。
*实现方法:首先,指针慢/快是指向链头的。
*快速指针向前移动两个节点,而慢速指针移动一个节点向前移动。
*循环直到快指向链尾。最后,慢点到链表head1尾。
* /
Int LinkSplit(链表的头,* * head1链表,链表head2)
{
链表的慢,快;

如果(头空头->下一| | = = = = null)
{
* head1 =头;
* head2 = null;
返回0;
}
慢=头;
快=头-下一个;
虽然(快)
{
快速=下一步;
如果(快)
{
快速=下一步;
慢=慢>下一步;
}
}
* head1 =头;
* head2 =慢>下;

/ /注:请务必列出head1将链空间的结束。
慢>下一个=空;
返回0;
}
链表合并函数有两种方法:递归实现和非递归实现。
非递归实现:

*
*链接列表。
*两个有序链表合并在一起,使整个链表有序。
*输入:链表,链表head2 head1
*输出:链接列表
*实现方法:插入节点的链表head2到适当的位置在链表head1,使head1仍然是一个有序链表。
* /
LinkList LinkMerge(head1链表,链表head2)
{
链表的P,Q,T;

如果(!head1)
返回head2;
如果(!head2)
返回head1;

/ /循环变量的初始化,q指向head1当前节点列表,P为Q的前兆。
p=null;
Q = head1;
而(head2)
{
将要插入到节点中。
T = head2;
head2 = head2 ->下;
查找插入位置、插入位置之间的p和q位置。
用于(;q - q;数据数据;P = q,Q = q -下);
如果(p = NULL)
head1 = T;
其他的
p =下一个;
下一个;
将节点插入t、p、q、p到q之间形成前体。
p=T;
}
返回head1;
}
递归实现:

linkmerge2链表(链表链表head1,head2)
{
链表的结果;

如果(!head1)
返回head2;
如果(!head2)
返回head1;

如果(head1 ->数据)
{
结果:head1;
结果->下= linkmerge(head1 ->下一步,head2);
}
其他的
{
结果:head2;
结果->下= linkmerge(head1,head2 ->下);
}
返回结果;
}
完整源代码:

*
*列表合并排序,从小到大。
* /
#定义_crt_secure_no_warnings
#包括
#包括

#定义总 / / 10链长度

清单存储
Typedef int ElemType;
结构中结点的定义
{
数据域;
Struct LNode *下;
} LNode * LinkList;

LinkList CreatLink(int num);
LinkList LinkMergeSort(链表的头);
LinkList LinkMerge(head1链表,链表head2);
linkmerge2链表(链表链表head1,head2);
Int LinkSplit(链表的头,* * head1链表,链表head2);
Int PrintLink(链表的头);

*
*创建链表。
*参数编号是链表的长度,函数返回链表的头指针。
* /
LinkList CreatLink(int num)
{
数据i;

p指向当前列表中的最后一个节点,q指向准备插入的节点。
链表的头= null,P = null,Q;

对于(i = 0;i <;;i + +)
{
Scanf(%d
Q =(链表)malloc(sizeof(LNode));
q =数据=数据;
q =下一个null;
如果(i = 0)
{
头= q;
}
其他的
{
p =下一个q;
}
p=q;
}
返回头;
}

*
*输出链表节点值。
* /
Int PrintLink(链表的头)
{
链表的P;
为(P =头;P;P = P -下)
{
printf(% 3D
}
返回0;
}

主()
{
链表的头;

printf(输入总数量创建链表:;
头= CreatLink(总);

头= LinkMergeSort(头);
printf(排序后:;
PrintLink(头);
Putchar(');
返回0;
}

*
*列表合并排序(升序)。
*输入:链表的头指针,
*输出:排序列表的头指针。
*递归实现方法:链表头分为两部分,合并排序分别进行,排序后的两部分合并在一起。
*递归终止条件:递归排序列表的列表为空或只有一个节点。
* /
LinkList LinkMergeSort(链表的头)
{
head1链表,head2;
如果(头空头->下一| | = = = = null)
返回头;

LinkSplit(头、head1,head2);
head1 = LinkMergeSort(head1);
head2 = LinkMergeSort(head2);
头= LinkMerge(head1,head2); / /非递归实现
/ /头= linkmerge2(head1,head2); / /递归
返回头;
}

*
*链接列表。
*两个有序链表合并在一起,使整个链表有序。
*输入:链表,链表head2 head1
*输出:链接列表
*实现方法:插入节点的链表head2到适当的位置在链表head1,使head1仍然是一个有序链表。
* /
LinkList LinkMerge(head1链表,链表head2)
{
链表的P,Q,T;

如果(!head1)
返回head2;
如果(!head2)
返回head1;

/ /循环变量的初始化,q指向head1当前节点列表,P为Q的前兆。
p=null;
Q = head1;
而(head2)
{
将要插入到节点中。
T = head2;
head2 = head2 ->下;
查找插入位置、插入位置之间的p和q位置。
用于(;q - q;数据数据;P = q,Q = q -下);
如果(p = NULL)
head1 = T;
其他的
P >下= T;
下一个;
将节点插入t、p、q、p到q之间形成前体。
p=T;
}
返回head1;
}

linkmerge2链表(链表链表head1,head2)
{
链表的结果;

如果(!head1)
返回head2;
如果(!head2)
返回head1;

如果(head1 ->数据)
{
结果:head1;
结果->下= linkmerge(head1 ->下一步,head2);
}
其他的
{
结果:head2;
结果->下= linkmerge(head1,head2 ->下);
}
返回结果;
}

*
*链表分配函数。
*链表的头被分为两部分head1和head2,如果链的长度是奇数,多节点从第一部分。
*实现方法:首先,指针慢/快是指向链头的。
*快速指针向前移动两个节点,而慢速指针移动一个节点向前移动。
*循环直到快指向链尾。最后,慢点到链表head1尾。
* /
Int LinkSplit(链表的头,* * head1链表,链表head2)
{
链表的慢,快;

如果(头空头->下一| | = = = = null)
{
* head1 =头;
* head2 = null;
返回0;
}
慢=头;
快=头-下一个;
虽然(快)
{
快速=下一步;
如果(快)
{
快速=下一步;
慢=慢>下一步;
}
}
* head1 =头;
* head2 =慢>下;

/ /注:请务必列出head1将链空间的结束。
慢>下一个=空;
返回0;
}

以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部