c++实现链表归并排序

来源:互联网 发布:非洲的基础网络情况 编辑:程序博客网 时间:2024/06/18 17:12

一. 定义节点

struct node {  int data;  node* next;  node(int data = 0, node* next = NULL)   :data(data), next(next) {}};

二. 归并排序主体结构

void mergesort(node*& head) {  if(head->next) {    node* mid = cut(head);    mergesort(head);    mergesort(mid);    head = merge(head, mid);  }}

三. cut函数, 将一条链表从中间断开, 返回后一条链表的头
实现方法是: 让两个指针同时走, 其中一个是另一个的速度的两倍

node* cut(node*& head) {  node* p = head;  node* q = head;  node* second_head;  while(q && q->next) {    q = q->next;    if(q->next) {      p = p->next;)      q = q->next;    }  }  second_head = p->next;  p->next = NULL;  return second_head;}

四. merge函数, 将两条有序(小到大的顺序)的链表按顺序合并(合并后也是有序的了)
算法: 两个指针分别指向两个链表的头, 每一次”取出”两个指针指向的节点当中值较小的节点, 再把那个指针后移, 这样一来取出来的节点就是按从小到大的顺序.

node* merge(node*& head, node*& mid) {  node tmp;  node *p = &tmp, *q = head, *t = mid;  while(q && t) {    if(q->data <= t->data) {      p->next = q;      p = p->next;      q = q->next;    }    else {      p->next = t;      p = p->next;      t = t->next;    }  }  if(q)     p->next = q;  else    p->next = t;  return tmp.next;}

这样就实现了从小到大排序的归并排序的链表算法!

原创粉丝点击