数据结构—有序表—归并排序
2016-05-04 21:01
337 查看
假设有两个有序表LA和LB,设计一个程序,将它们合并成一个有序表LC(假设每个有序表中和两个有序表间均不存在重复元素)。要求不破坏原有表LA和LB。
思路:
二路归并算法:分别扫描LA和LB两个有序表,当两个有序表都没有扫描完时循环:比较LA、LB的当前元素,将其中较小的元素放入LC中,再从较小元素所在的
有序表中取下一个元素。重复这个过程直到LA或LB比较完毕,最后将未比较完的有序表余下的元素放入LC中。
顺序表:
#include <iostream>
#include <malloc.h>
#define MaxSize 100
using namespace std;
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
} SqList;
void InitList(SqList *&L) //初始化顺序表L
{
L=(SqList *)malloc(sizeof (SqList));
L->length=0;
}
void ListInsert(SqList *&L,ElemType a[],int n) //采用尾插法依次插入元素
{
for(int i=0; i<n; i++)
L->data[i]=a[i];
L->length=n;
}
void DispList(SqList *L) //输出顺序表L
{
for(int i=0; i<L->length; i++)
cout<<L->data[i]<<" ";
cout<<endl;
}
void UnionList(SqList *LA,SqList *LB,SqList *&LC) //合并两个有序表
{
int i=0,j=0,k=0;
LC=(SqList *)malloc(sizeof(SqList));
while(i<LA->length&&j<LB->length) //LA和LB均未到达表尾时,择其小插入LC中
{
if(LA->data[i]<LB->data[j])
{
LC->data[k]=LA->data[i];
i++;
k++;
}
else
{
LC->data[k]=LB->data[j];
j++;
k++;
}
}
while(i<LA->length) //LA尚未扫描完,将其它元素插入LC中
{
LC->data[k]=LA->data[i];
i++;
k++;
}
while(j<LB->length) //LB尚未扫描完,将其它元素插入LC中
{
LC->data[k]=LB->data[j];
j++;
k++;
}
LC->length=k;
}
int main()
{
ElemType a[3]={1,3,5},b[4]={2,4,8,10};
SqList *LA,*LB,*LC;
InitList(LA);
InitList(LB);
ListInsert(LA,a,3);
cout<<"LA中的元素:";
DispList(LA);
ListInsert(LB,b,4);
cout<<"LB中的元素:";
DispList(LB);
UnionList(LA,LB,LC);
cout<<"LC中的元素:";
DispList(LC);
return 0;
}
运行结果:
单链表:
#include <iostream>
#include <malloc.h>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
void InitList(LinkList *&L) //初始化单链表
{
L=(LinkList *)malloc(sizeof (LinkList));
L->next=NULL;
}
void CreateListR(LinkList *&L,ElemType a[],int n) //采用尾插法依次插入元素
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0; i<n; i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void DispList(LinkList *L) //输出单链表
{
LinkList *p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void UnionList(LinkList *LA,LinkList *LB,LinkList *&LC) //合并两个有序表
{
LinkList *pa=LA->next,*pb=LB->next,*r,*s;
LC=(LinkList *)malloc(sizeof(LinkList));
r=LC;
while(pa!=NULL&&pb!=NULL) //LA和LB均未到达表尾时,择其小插入LC中
{
if(pa->data<pb->data)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;
}
else
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next;
}
}
while(pa!=NULL) //LA尚未扫描完,将其它元素插入LC中
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;
}
while(pb!=NULL) //LB尚未扫描完,将其它元素插入LC中
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next;
}
r->next=NULL;
}
int main()
{
LinkList *LA,*LB,*LC;
ElemType a[3]= {1,3,5},b[4]= {2,4,8,10};
InitList(LA);
InitList(LB);
CreateListR(LA,a,3);
CreateListR(LB,b,4);
cout<<"LA中的元素:";
DispList(LA);
cout<<"LB中的元素:";
DispList(LB);
UnionList(LA,LB,LC);
cout<<"LC中的元素:";
DispList(LC);
return 0;
}
运行结果:
思路:
二路归并算法:分别扫描LA和LB两个有序表,当两个有序表都没有扫描完时循环:比较LA、LB的当前元素,将其中较小的元素放入LC中,再从较小元素所在的
有序表中取下一个元素。重复这个过程直到LA或LB比较完毕,最后将未比较完的有序表余下的元素放入LC中。
顺序表:
#include <iostream>
#include <malloc.h>
#define MaxSize 100
using namespace std;
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
} SqList;
void InitList(SqList *&L) //初始化顺序表L
{
L=(SqList *)malloc(sizeof (SqList));
L->length=0;
}
void ListInsert(SqList *&L,ElemType a[],int n) //采用尾插法依次插入元素
{
for(int i=0; i<n; i++)
L->data[i]=a[i];
L->length=n;
}
void DispList(SqList *L) //输出顺序表L
{
for(int i=0; i<L->length; i++)
cout<<L->data[i]<<" ";
cout<<endl;
}
void UnionList(SqList *LA,SqList *LB,SqList *&LC) //合并两个有序表
{
int i=0,j=0,k=0;
LC=(SqList *)malloc(sizeof(SqList));
while(i<LA->length&&j<LB->length) //LA和LB均未到达表尾时,择其小插入LC中
{
if(LA->data[i]<LB->data[j])
{
LC->data[k]=LA->data[i];
i++;
k++;
}
else
{
LC->data[k]=LB->data[j];
j++;
k++;
}
}
while(i<LA->length) //LA尚未扫描完,将其它元素插入LC中
{
LC->data[k]=LA->data[i];
i++;
k++;
}
while(j<LB->length) //LB尚未扫描完,将其它元素插入LC中
{
LC->data[k]=LB->data[j];
j++;
k++;
}
LC->length=k;
}
int main()
{
ElemType a[3]={1,3,5},b[4]={2,4,8,10};
SqList *LA,*LB,*LC;
InitList(LA);
InitList(LB);
ListInsert(LA,a,3);
cout<<"LA中的元素:";
DispList(LA);
ListInsert(LB,b,4);
cout<<"LB中的元素:";
DispList(LB);
UnionList(LA,LB,LC);
cout<<"LC中的元素:";
DispList(LC);
return 0;
}
运行结果:
单链表:
#include <iostream>
#include <malloc.h>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
void InitList(LinkList *&L) //初始化单链表
{
L=(LinkList *)malloc(sizeof (LinkList));
L->next=NULL;
}
void CreateListR(LinkList *&L,ElemType a[],int n) //采用尾插法依次插入元素
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0; i<n; i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void DispList(LinkList *L) //输出单链表
{
LinkList *p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void UnionList(LinkList *LA,LinkList *LB,LinkList *&LC) //合并两个有序表
{
LinkList *pa=LA->next,*pb=LB->next,*r,*s;
LC=(LinkList *)malloc(sizeof(LinkList));
r=LC;
while(pa!=NULL&&pb!=NULL) //LA和LB均未到达表尾时,择其小插入LC中
{
if(pa->data<pb->data)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;
}
else
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next;
}
}
while(pa!=NULL) //LA尚未扫描完,将其它元素插入LC中
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;
}
while(pb!=NULL) //LB尚未扫描完,将其它元素插入LC中
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next;
}
r->next=NULL;
}
int main()
{
LinkList *LA,*LB,*LC;
ElemType a[3]= {1,3,5},b[4]= {2,4,8,10};
InitList(LA);
InitList(LB);
CreateListR(LA,a,3);
CreateListR(LB,b,4);
cout<<"LA中的元素:";
DispList(LA);
cout<<"LB中的元素:";
DispList(LB);
UnionList(LA,LB,LC);
cout<<"LC中的元素:";
DispList(LC);
return 0;
}
运行结果:
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)