c++实现链表归并排序

一. 定义节点

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;
}

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

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值