表插入排序 具体解释 及 代码(C++)

本文地址: http://blog.csdn.net/caroline_wendy/article/details/24323125

表插入排序(List Insertion Sort)是使用静态链表进行插入排序, 每次插入改动指针项, 通过指针项的链接顺序,

使静态链表有序.

改动2n次指针, 取代移动2n次数据, 由于每次改动2个指针值(代码中可见), 但比較次数仍为O(n^2);

重排记录: 3(n-1)次记录移动, 记录须要交换,一次交换式三次移动数据.

所以时间复杂度为O(n^2).

实例代码为C++, 使用2个数组, 清晰的显示了值域和指针域.

代码:

/*

* test.cpp

*

* Created on: 2014.04.22

* Author: Spike

*/

/*eclipse cdt, gcc 4.8.1*/

#include

#include

#include

using namespace std;

//打印排序的序列

void printSeq(const std::deque& vals, std::deque& ptrs) {

int t = 0;

for (std::size_t i=0; i

t = ptrs[t];

std::cout << vals[t] << " ";

if (ptrs[t] == 0) {

break;

}

}

std::cout << std::endl;

}

//打印数组

void print(const std::deque& L) {

for (auto i : L) {

std::cout << i << " ";

}

std::cout << std::endl;

}

//表插入排序

void ListInsertSort(const std::deque& vals, std::deque& ptrs) {

const int length(vals.size());

ptrs.resize(length);

ptrs[0] = 1;

ptrs[1] = 0;

for (int i=2; i

int t = 0; //从0開始查找

int pre = 0; //记录前一个指针

for (int j=0; j

t = ptrs[t]; //找到指针的位置

if (vals[t] > vals[i]) { //小于插到后面

ptrs[i] = t;

ptrs[pre] = i;

break; //终止

} else if (ptrs[t] == 0) { //末尾, 直接插入前面

ptrs[i] = 0;

ptrs[t] = i;

}

pre = t; //记录指针

}

//測试

std::cout << "Pointer: "; print(ptrs);

}

}

//重排记录

void Arrange(std::deque& vals, std::deque& ptrs) {

const int length(vals.size());

int t = 0;

int pre = 0;

t = ptrs[t];

for (int i=1; i

while( t<=i && t!=0) { //顺次找到结点

t = ptrs[t];

}

if(t == 0)

break;

pre = ptrs[t];

if (t != i) { //交换值, 交换指针

int temp = vals[t];

vals[t] = vals[i];

vals[i] = temp;

int temp2 = ptrs[i];

ptrs[i] = t;

ptrs[t] = temp2;

}

t = pre;

std::cout << "Pointer: "; print(ptrs);

}

}

int main(void) {

std::deque vals = {INT_MAX, 49, 38, 65, 97, 76, 13, 27, 49};

std::deque ptrs;

print(vals);

ListInsertSort(vals, ptrs);

printSeq(vals, ptrs);

Arrange(vals, ptrs);

print(vals);

return 0;

}

输出:

2147483647 49 38 65 97 76 13 27 49

Pointer: 2 0 1 0 0 0 0 0 0

Pointer: 2 3 1 0 0 0 0 0 0

Pointer: 2 3 1 4 0 0 0 0 0

Pointer: 2 3 1 5 0 4 0 0 0

Pointer: 6 3 1 5 0 4 2 0 0

Pointer: 6 3 1 5 0 4 7 2 0

Pointer: 6 8 1 5 0 4 7 2 3

13 27 38 49 49 65 76 97

Pointer: 6 6 1 5 0 4 8 2 3

Pointer: 6 6 7 5 0 4 8 1 3

Pointer: 6 6 7 7 0 4 8 5 3

Pointer: 6 6 7 7 6 4 0 5 3

Pointer: 6 6 7 7 6 8 0 5 4

Pointer: 6 6 7 7 6 8 7 0 4

Pointer: 6 6 7 7 6 8 7 8 0

2147483647 13 27 38 49 49 65 76 97

c语言 静态链表插入排序,数据结构 - 表插入排序 具体解释 及 代码(C++)相关推荐

  1. c语言 静态链表插入排序,数据结构C语言版 表插入排序

    西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...

  2. 遗落在时光里的静态链表(线性表的静态存储)---C语言版

    目录 静态链表的定义 静态链表的操作 初始化 求表长 分配空间 回收空间 插入操作 删除操作 其他操作 完整源代码 总结一下 众所周知,指针是c语言的灵魂,指针使得链表的实现简单明了起来. 但是问题来 ...

  3. java静态链表_数据结构笔记:静态链表(C语言)

    void CreateList(StaticLinkList *P)//创建一个静态链表 { int i; for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空 ...

  4. 插入排序之表插入排序

    1.表插入排序只是求得一个有序的链表,它是修改指针的值来代替移动记录,操作过程如下 2.但是这样只能进行顺序查找,不能进行随机查找,为了能实现有序表的折半查找,需要对记录进行重新排列.操作过程如下: ...

  5. c语言单链表功能,[数据结构]单链表(C语言)的各种功能

    06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...

  6. c语言动态存储分配和链表,C语言静态链表和动态链表

    1. 静态链表 结构体中的成员可以是各种类型的指针变量,当一个结构体中有一个或多个成员的基类型是本结构体类型时,则称这种结构体为"引用自身的结构体".如: struct link ...

  7. 《大话数据结构》5一文学会数据结构中的静态链表存储结构(概念,实例,代码)

    静态链表 1.静态链表基本介绍 (1)静态链表:用数组来代替指针,来描述单链表.我们把用数组描述下标的链表叫做静态链表.也叫游标实现法. (2)首先让数组的元素是两个数据域组成,data 和cur.也 ...

  8. 程序设计C语言-静态链表及指针

    程序设计C语言的学习笔记,静态链表的指针实现 struct Student {int num;float score;struct Student *next; }; struct Student s ...

  9. 树的同构(c语言静态链表实现)

    题目 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子 ...

最新文章

  1. sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息
  2. 计算机网络:第三章 数据链路层
  3. docker容器间数据共享
  4. 改进博客园Markdown显示功能(加代码行号、显示代码所用编程语言)
  5. idea导入maven项目依赖报错_解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?
  6. JavaScript之BOM对象(JS函数作用域、window、history、location对象)
  7. SpringCloudConfig分布式配置中心-基本使用
  8. 【并查集】Union Find
  9. 1059: [ZJOI2007]矩阵游戏 - BZOJ
  10. DTD(Document Type Definition) 简介
  11. Promise.all的深入理解
  12. 关闭appleid双重认证_苹果官方科普来了:全面认识Apple ID
  13. WinForm 无边框窗体四周阴影 窗体可拖动 无边框自定义标题栏
  14. 中国大学计算机专业排名教育部,中国校友会网2018中国大学计算机类各本科专业排行榜...
  15. Java电商平台-电商订单系统全解析
  16. 【JavaScript练习】实现数组按照数组项中userName中的姓名拼音排序
  17. ftp服务器 修改文件,ftp服务器修改文件属性的权限
  18. 狂神css视频笔记1-15课
  19. 搜索官方的一篇相关性文章分享
  20. 【C语言】字符数组的定义及使用

热门文章

  1. 【Elasticsearch】es 快照 snapshot 操作实战
  2. 【MySQL】MySQL 数据库表锁和行锁
  3. 【Clickhouse】Clickhouse 分析函数 window functions 窗口函数
  4. 【Elasticsearch】es 各种 日志 慢日志 慢查询
  5. 【MySQL】mysql 数据库名称 中间带有中划线问题
  6. Spring : Spring Aop JDK动态代理调用过程
  7. spark学习-42-Spark的driver理解和executor理解
  8. for和foreach
  9. Cloud Native的设计哲学理念,kubernetes云生态操作系统
  10. 他35k月薪,如何扛住redis面试!