两路归并排序

链表两路归并

#include<iostream>

#include<assert.h>

using namespace std;

struct node

{

int val;

node * next;

node(int v)

{

val=v;

next=NULL;

}

};

node * merge(node* list1 , node * list2)

{

assert(list1!=NULL&&list2!=NULL);//括号中是希望出现的正确的情况
 node * res;

if(list1->val<=list2->val)

{

res=list1;

list1=list1->next;

}

else

{

res=list2;

list2=list2->next;

}

node * p = res;

node *p1 =list1,*p2 =list2;

while(p1!=NULL&&p2!=NULL)

{

if(p1->val<=p2->val)

{

p->next=p1;

p=p->next;

p1=p1->next;

}

else

{

p->next=p2;

p=p->next;

p2=p2->next;

}

}

while(p1!=NULL)

{

p->next=p1;

p=p->next;

p1=p1->next;

}

while(p2!=NULL)

{

p->next=p2;

p=p->next;

p2=p2->next;

}

return res;

}

int * merge(int * arr1,int la, int * arr2,int lb)

{

int i=0,j=0;

int * arr = new int[la+lb];

int t=0;

while(i<la&&j<lb)

{

if(arr1[i]<=arr2[j])

{

arr[t++]=arr1[i];

i++;

}

else

{

arr[t++]=arr2[j];

j++;

}

}

while(i<la)

{

arr[t++]=arr1[i];

i++;

}

while(j<lb)

{

arr[t++]=arr2[j];

j++;

}

return arr;

}

void setLinkData(node * & list1 , node * & list2)

{

node * node1 = new node(2);

node * node2 = new node(3);

node * node3 = new node(7);

node * node4= new node(9);

node1->next=node2;

node2->next=node3;

node3->next=node4;

list1=node1;

node * node5 = new node(1);

node * node6 = new node(4);

node * node7 = new node(6);

node * node8 = new node(8);

node5->next=node6;

node6->next=node7;

node7->next=node8;

list2=node5;

}

int main()

{

node * list1;

node * list2;

setLinkData(list1,list2);

int arr1[]={1,6,15,17,19};

int arr2[]={2,4,6,8,10};

int * arr = merge(arr1,5,arr2,5);

node * ans = merge(list1,list2);

//Print result

int length=10;

for(int i=0;i<10;i++)

{

cout<<*arr<<endl;

arr++;

}

while(ans!=NULL)

{

cout<<ans->val<<endl;

ans=ans->next;

}

return 0;

}

——————————————————————————————————————

void Merge(SeqList R,int low,int m,int high)

{//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的

//子文件R[low..high]

int i=low,j=m+1,p=0; //置初始值

RecType *R1; //R1是局部向量,若p定义为此类型指针速度更快

R1=(ReeType *)malloc((high-low+1)*sizeof(RecType));

if(! R1) //申请空间失败

Error("Insufficient memoryavailable!");

while(i<=m&&j<=high) //两子文件非空时取其小者输出到R1[p]上

R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];

while(i<=m) //若第1个子文件非空,则复制剩余记录到R1中

R1[p++]=R[i++];

while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中

R1[p++]=R[j++];

for(p=0,i=low;i<=high;p++,i++)

R[i]=R1[p];//归并完成后将结果复制回R[low..high]

} //Merge

——————————————————————————————————————

二路归并排序(链式存储)

以单链表为存储结构, 实现二路归并排序的算法

要求链表不另外占用存储空间, 排序过程中不移动结点中的元素, 只改各链结点中的指针, 排序后r仍指示结果链表的第一个结点

先 对待排序的单链表进行一次扫描, 将它划分为若干有序的子链表, 其表头指针存放在一个指针队列中。当队列不空时重复执行, 从队列中退出两个有序子链 表, 对它们进行二路归并, 结果链表的表头指针存放到队列中。如果队列中退出一个有序子链表后变成空队列, 则算法结束。这个有序子链表即为所求。

  1. 两路归并算法
  2. void merge ( ListNode * ha, ListNode * hb,, ListNode *& hc ) {
  3. ListNode *pa, *pb, *pc ;

if ( ha→data<= hb→data ) { hc = ha; pa = ha→link; pb = hb; }

else { hc = hb; pb = hb→link; pa = ha ; }

pc = hc;

while ( pa && pb )

if (pa→data <= pb→data)

{ pc→link = pa; pc = pa;

pa = pa→link;

}

else

{ pc→link = pb; pc = pb;

pb = pb→link;

}

if ( pa ) pc→link= pa;

else pc→link = pb;

}

(2) 归并排序主程序

void mergesort ( ListNode * r ) {

ListNode * s, t; Queue Q ;

if ( ! r ) return;

s = r;

Q.EnQueue( r );

while ( s ) {

t = s→link;

while ( t != 0 && s→data <= t→data ) { s = t; t = t→link; }

if ( t ) {

s→link = 0; s = t;

Q.EnQueue( s );

}

}

while ( !Q.IsEmpty( ) ) {

r = Q.DlQueue( );

if ( Q.IsEmpty( ) ) break;

s = Q.DlQueue( );

merge( r, s, t );

Q.EnQueue( t );

}

}2路归并排序法?你是指mergesort?C+++是什么语言?

template<typename T>void merge(T a[],int i,int j,int k){

int b=i,c=j+1,d=0;

T *temp=new T[k-i+1];

while(b<=j&&c<=k){

if(a[b]<a[c]) temp[d++]=a[b++];

else temp[d++]=a[c++];

}

if(b<=j){

while(b<=j) temp[d++]=a[b++];

}

if(c<=k){

while(c<=k)temp[d++]=a[c++];

}

d=0;

for(b=i;b<=k;b++)

a[b]=temp[d++];

delete[] temp;

}

template<typename T>void msort(T a[],int i,int j){

if(j-i<0) return;

else{

int mid=(i+j)/2;

msort(a,i,mid);

msort(a,mid+1,j);

merge(a,i,mid,j);

}

}

template<typename T> void merge_sort(T a[],int n){

msort(a,0,n-1);

}

时间: 2024-10-10 11:01:18

两路归并排序的相关文章

混杂设备驱动--输出两路PWM

尝试用2440的TOUT0和TOUT1输出PWM驱动两个电机,电机的硬件驱动电路是使用L298N. 先单独测试TOUT0的PWM输出: (1)驱动程序:使用misc混杂设备驱动模型,当然也可以使用基本的字符设备模型. 使用misc设备驱动模型步骤: ①初始化一个struct miscdevice结构体:主要是file_operation结构体成员和name ②使用misc_register和misc_deregister注册和注销这个结构体 代码示例: #include <linux/modul

[TM4C123单片机实战] 两路ADC检测,短路报警

如果最终得到的数据是两路数据的差值, 我们可以采用ADC的 Difference 工作模式 #include <stdbool.h> #include <stdint.h> #include "inc/hw_memmap.h" #include "driverlib/adc.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #in

nRF51822 的两路 PWM 极性

忙了一阵这个PWM,玩着玩着终于发现了些规律.Nordic 也挺会坑爹的. nRF51822 是没有硬件 PWM 的,只能靠一系列难以理解的 PPI /GPIOTE/TIMER来实现,其实我想说,我醉了. 幸好SDK有这个的demo,不然真的很醉.这里说的是SDK9.0.0. 即便是有SDK,相信很多人都像我一样,看下去会觉得晕头转向的,不过知道几个函数的应用就可以了. 先记下怎么开始用一个PWM.这里我要用2路极性相反的PWM. 先来初始化两个个PWM实例,名字是PWM1.PWM2,用硬件Ti

AR9344在Linux下启用两路UART

AR9344支持两路UART,平常用的调试串口都是UART0,驱动是使用8250的,今天因项目需求启用UART1,配置过程中需要注意几点 1. 9344的GPIO口是复用的,可以灵活配置大多数支持的功能,需要找两个GPIO,配置成UART1_TD和UART1_RD功能(如果使用硬件流控,需要再找两个GPIO配置成CTS和RTS) 2. 驱动可以使用ar93xx_uart.c,如果不使用硬件CTS和RTS功能,需要在驱动中配置成禁用硬件流控,一开始调试就是RX接收正常但TX的数据总是发送失败,最后

#23 Merge k Sorted Lists (N路归并排序)

#23 Merge k Sorted Lists (N路归并排序) 题目地址:#23 题目分类:链表/归并排序/堆排序 题目难度:hard 题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 翻译:合并K个已经排序的链表,返回一个排序好的链表. 思路 暴力法,我们很容易想到:以一个for循环遍历所有的链表,找出最小的,然后将这个节点加入新的链表

STM32F207 两路ADC连续转换及GPIO模拟I2C给Camera Sensor初始化参数

1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯片,是I2C是8位宽的,而镁光的地址是8位,而数据位是16个字节, 其实不管是8位还是16位,每次发送都是8个字节然后一个应答位,所以只要稍微改下代码即可. 3.实现两路ADC连续转换,两路ADC转换:一路是检测锂电池电压:一路是检测压力传感器,其实都是检测电压,当检测到压力为零,并累计多长时间后进

编程算法 - K路归并排序(k-way merge sort) 代码(C++)

K路归并排序(k-way merge sort) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy K路归并排序作为经典的外部排序算法, 是程序员必须要掌握的. 知识概念参考: <数据结构> 主要思想: 在k个已排序的文件中, 选择第一个值, 采用败者树, 更新二叉树结构, 最终选择最优值. 代码仅供参考, 如最小值用(-1)代替, 最大值用(100)代替. /* * main.cpp * * Created on: 2014年9月11日 *

排序--两路排序

#include<iostream> using namespace std; #define SIZE 21 typedef int Sqlist[SIZE]; void TwayTnsertSort(Sqlist &T,Sqlist &S,int n) { int i,j,k; int first=0; int last = 0; S[first]= S[last] = T[0]; for(i=1;i<n;++i) { if(T[i] >= S[last]) {

FFmpeg 学习之 定时器解码两路视频并进行对比

两路视频跳帧的一些想法: 关于多路视频,如果不涉及对比的话,多线程是最佳选择,来一路视频的话,直接开一个线程去显示处理,非常有效,方便. 但如果说要求两路视频的图像的相似度,那么便牵扯到解码同步问题,如果说一路是本地视频文件,一路是网络视频流,那么很可能由于其帧型的不同,导致解码效率不同,相同序号的帧出现在两个时刻.感觉对比的话,应该是在线程里,当然,鉴于计算量比较大,比较的时候可以再开线程,此为后话. 再说同步的问题,可设置标志位,标定帧号.由于解码本地视频丢帧率较小,且由于帧型而导致解码效率