#include <iostream>
using namespace std;
//别问我为什么要写链表的冒泡排序。
struct Node
{
int data;
Node *next;
Node(int d = int()) :data(d), next(NULL){}
};
class List
{
public:
List(int a[], int n)
{
first = NULL;
for (int i = 0; i < n; i++)
{
if (first == NULL)
{
first = new Node(a[i]);
}
else
{
Node *s = new Node(a[i]);
Node *p = first;
while (p->next != NULL)
{
p = p->next;
}
s->next = p->next;
p->next = s;
}
}
}
//////////////////////////////////////////////////////////////////////////////
//冒泡排序
void Bul()
{
Node *ptr_one = first;
Node *ptr_twe;
Node *pr_one = NULL;
Node *save = NULL;
if (ptr_one == NULL || ptr_one->next == NULL)return;
while (ptr_one != NULL && ptr_one->next != NULL)
{
Node *pr_twe = ptr_one;
Node *m2 = NULL;
save = ptr_one;
for (ptr_twe = ptr_one->next; ptr_twe != NULL;)
{ if (ptr_one->data > ptr_twe->data)
{
if (pr_one == NULL)
{
Node *m1;
Node *a;
m1 = ptr_twe->next;
m2 = ptr_one->next; first->next = m1;
pr_twe->next = first;
a = first;
ptr_twe->next = m2;
first = ptr_twe; save = ptr_twe; ptr_twe = a;
ptr_one = first;
}
else
{
Swap(pr_one, pr_twe);
save = pr_one->next;
ptr_one = save;
ptr_twe = pr_twe->next;
}
}
pr_twe = ptr_twe;
if (ptr_twe == NULL)continue;
ptr_twe = ptr_twe->next;
}
pr_one = save; ptr_one = pr_one->next;
}
}
void Swap(Node *prv1, Node *&prv2)
{
if (prv1->next == prv2)
{
Node *m = prv1->next;
Node *n = prv2->next;
m->next = n->next;
n->next = m;
prv1->next = n;
prv2 = n;
}
else
{
Node *m1 = prv1->next;
Node *save = m1->next;
Node *m2 = prv2->next;
m1->next = m2->next;
prv2->next = m1;
m2->next = save;
prv1->next = m2;
}
} void Printf()
{
Node *p = first;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
//////////////////////////////////////////////////////////////////////////////////////
//2路归并排序。
Node *GetMidNode(Node* Start_Ptr)
{
Node *slow = Start_Ptr;
Node *fast = Start_Ptr;
if (Start_Ptr == NULL || Start_Ptr->next == NULL || Start_Ptr->next->next==NULL)return Start_Ptr;
while (fast != NULL)
{
if (fast->next == NULL)
{
break;
}
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
void Merge()
{
Merge(first);
}
Node* Merge(Node *Start_Ptr)
{
if (Start_Ptr==NULL || Start_Ptr->next == NULL) return Start_Ptr;
else
{
Node *Mid_Ptr = GetMidNode(Start_Ptr);
Node *Next_Ptr = Mid_Ptr->next;
Mid_Ptr->next = NULL;
return Merage(Merge(Start_Ptr),Merge(Next_Ptr));
}
}
Node* Merage(Node *ptr1, Node *ptr2)
{
Node* p1 = ptr1;
Node *p2 = ptr2;
Node *p = new Node();
Node *save = p;
while (p1 != NULL && p2 != NULL)
{
if (p1->data > p2->data)
{
p->next=p2;
p = p2;
p2 = p2->next;
}
else
{
p->next = p1;
p = p1;
p1 = p1->next;
}
}
if (p1 == NULL)
{
p->next = p2;
}
if (p2 == NULL)
{
p->next = p1;
}
first = save->next;
delete save;
save = NULL;
return first;
}
//////////////////////////////////////////////////////////////////////////////////////////
//插入排序。
void Insert()
{
Node *ptr_first = first;
Node *pr_first;
Node *ptr_twe;
Node *pr_twe;
Node *save;
for (; ptr_first != NULL;pr_first = ptr_first)
{
save = ptr_first->next;
if (ptr_first == first)
{
ptr_twe = ptr_first;
ptr_twe->next = NULL;
first = ptr_twe;
}
else
{
Node *p = ptr_twe; Node *q = ptr_first;
while (p!=NULL&&p->data<q->data)
{
pr_twe = p;
p = p->next;
}
if (p == first)
{
//假设是第一个节点插入。
q->next = p;
ptr_twe = q;
first = ptr_twe; }
else if(p == NULL)
{
pr_twe->next = q;
q->next = NULL;
}
else
{
q->next = pr_twe->next;
pr_twe->next = q;
}
}
ptr_first = save;
}
}
private:
Node *first;
};
int main()
{
int a[] = { 6,7,2,1,0,7,5,23,4,5,423,4,100,-32,4,-3,1};
List list(a, sizeof(a) / sizeof(int));
//list.Merge();
//list.Bul();
list.Insert();
list.Printf();
return 0;
}

C++链表冒泡,归并,插入排序(纯指针)的更多相关文章

  1. 算法导论(第三版)Problems2(归并插入排序、数列逆序计算)

    讨论内容不说明,仅提供相应的程序. 2.1:归并插入排序θ(nlgn) void mergeInsertionSort(int a[], int l, int r, int k) { int m; & ...

  2. SDUT OJ 数据结构实验之链表四:有序链表的归并

    数据结构实验之链表四:有序链表的归并 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Desc ...

  3. SDUT-2119_数据结构实验之链表四:有序链表的归并

    数据结构实验之链表四:有序链表的归并 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 分别输入两个有序的整数序列(分别包 ...

  4. 浅谈归并排序:合并 K 个升序链表的归并解法

    在面试中遇到了这道题:如何实现多个升序链表的合并.这是 LeetCode 上的一道原题,题目具体如下: 用归并实现合并 K 个升序链表 LeetCode 23. 合并K个升序链表 给你一个链表数组,每 ...

  5. leetcode:Merge Two Sorted Lists(有序链表的归并)

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  6. 环形链表II 142 使用快慢指针(C++实现)

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  7. 数据结构实验之链表四:有序链表的归并(SDUT 2119)

    #include <bits/stdc++.h> using namespace std; struct node { int data; struct node *next; }; st ...

  8. LeetCode--147.对链表进行插入排序

    题目描述: 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中. 插入排序算法 ...

  9. 通过数组初始化链表的两种方法:指向指针的引用node *&tail和指向指针的指针(二维指针)node **tail

    面试高频题:单链表的逆置操作/链表逆序相关文章 点击打开 void init_node(node *tail,char *init_array) 这样声明函数是不正确的,函数的原意是通过数组初始化链表 ...

随机推荐

  1. jq微信分享

    (function() { var weChat = { init: function() { this.getData(); }, getData: function() { $.ajax({ ty ...

  2. CAD由一个自定义实体事件中的id得到自定义实体对象(com接口VB语言)

    由一个自定义实体事件中的id得到自定义实体对象.该函数只能在自定义实体事件中调用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

  3. 实现加载页Loading Page 的几种方法

    网页也可以像原生应用那样加入进度条或者其他的loading效果带来更好的等待体验,这里归纳几种我收集的实现loading page的方法,这几种方法在交互上都有利有弊,适用于不同应用.(PS:以下方法 ...

  4. 03C++基本数据类型

    基本数据类型 2.2.1整型数据 短整型(short int) 有符号短整型(signed short int) 无符号短整型(unsigned short int) 一般整型(int) 有符号一般整 ...

  5. 【6.24校内test】T1 江城唱晚

    [题目背景] 墙角那株海棠,是你种下的思念. 生死不能忘,高烛照容颜. 一曲江城唱晚,重忆当年坐灯前, 青衫中绣着你留下的线. ——银临<江城唱晚> [问题描述] 扶苏是个喜欢一边听古风歌 ...

  6. document.write() 和 document.writeln区别

    document.write() 和 document.writeln 都是JavaScript向客户端写入的方法,writeln是以行方式输出的,但并不是指页面实际效果中的换行,两种方法在查看源代码 ...

  7. HDU - 2050 - 折线分割平面(数学 + dp)

    题意: 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分 思路: 记住结论.. ...

  8. HDU - 4810 - Wall Painting (位运算 + 数学)

    题意: 从给出的颜料中选出天数个,第一天选一个,第二天选二个... 例如:第二天从4个中选出两个,把这两个进行异或运算(xor)计入结果 对于每一天输出所有异或的和 $\sum_{i=1}^nC_{n ...

  9. <MyBatis>入门三 sqlMapper文件

    增加 1.增删改在接口中的返回值 Integer.Long.Boolean.void 返回影响多少行 或 true | false 2.mapper 中 增删改没有返回值 (resultType或re ...

  10. python面向对象的特点,类定义等,私有属性、公有属性、成员属性

    引子:类的对象在内存中的表示def dog(name,dog_type): def bark(d): print(d,'wang wang wang ...') data = { 'name':nam ...