数据结构—有序表—归并排序
来源:互联网 发布:php strcmp函数 编辑:程序博客网 时间:2024/06/08 06:58
假设有两个有序表LA和LB,设计一个程序,将它们合并成一个有序表LC(假设每个有序表中和两个有序表间均不存在重复元素)。要求不破坏原有表LA和LB。
思路:
二路归并算法:分别扫描LA和LB两个有序表,当两个有序表都没有扫描完时循环:比较LA、LB的当前元素,将其中较小的元素放入LC中,再从较小元素所在的
有序表中取下一个元素。重复这个过程直到LA或LB比较完毕,最后将未比较完的有序表余下的元素放入LC中。
顺序表:
#include <iostream>#include <malloc.h>#define MaxSize 100using 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;}
运行结果:
0 0
- 数据结构—有序表—归并排序
- 数据结构 — 归并排序
- 数据结构 — 归并排序
- 数据结构——顺序表有序顺序表归并
- 数据结构——归并排序
- 数据结构——归并排序
- 数据结构——归并排序
- 数据结构之排序——归并排序
- 数据结构——链表之有序链表的归并
- 数据结构之有序链表的归并
- 数据结构——2路归并排序
- 数据结构与算法——归并排序
- 数据结构——归并排序算法
- 【数据结构与算法】——归并排序
- 数据结构例程——归并排序
- 数据结构与算法——归并排序
- 【数据结构与算法】——归并排序
- 数据结构之——归并排序
- SQL Server 查询数据库中所有的表名及行数
- POJ 1108 Split Windows
- webView浅析
- Netty系列之Netty高性能之道
- iOS开发中如何生成一段xml及xml文档
- 数据结构—有序表—归并排序
- ARM学习笔记整理
- 平面上的邮局
- 51nod 1069 Nim游戏
- 【机器学习】最速下降法和牛顿下降法
- git仓库迁移和更新远程仓库地址
- 面试题整理笔记(一)
- bzoj 2196 Computer(树形DP)
- 递归的两个例程