c语言 静态链表插入排序,数据结构 - 表插入排序 具体解释 及 代码(C++)
表插入排序 具体解释 及 代码(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++)相关推荐
- c语言 静态链表插入排序,数据结构C语言版 表插入排序
西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...
- 遗落在时光里的静态链表(线性表的静态存储)---C语言版
目录 静态链表的定义 静态链表的操作 初始化 求表长 分配空间 回收空间 插入操作 删除操作 其他操作 完整源代码 总结一下 众所周知,指针是c语言的灵魂,指针使得链表的实现简单明了起来. 但是问题来 ...
- java静态链表_数据结构笔记:静态链表(C语言)
void CreateList(StaticLinkList *P)//创建一个静态链表 { int i; for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空 ...
- 插入排序之表插入排序
1.表插入排序只是求得一个有序的链表,它是修改指针的值来代替移动记录,操作过程如下 2.但是这样只能进行顺序查找,不能进行随机查找,为了能实现有序表的折半查找,需要对记录进行重新排列.操作过程如下: ...
- c语言单链表功能,[数据结构]单链表(C语言)的各种功能
06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...
- c语言动态存储分配和链表,C语言静态链表和动态链表
1. 静态链表 结构体中的成员可以是各种类型的指针变量,当一个结构体中有一个或多个成员的基类型是本结构体类型时,则称这种结构体为"引用自身的结构体".如: struct link ...
- 《大话数据结构》5一文学会数据结构中的静态链表存储结构(概念,实例,代码)
静态链表 1.静态链表基本介绍 (1)静态链表:用数组来代替指针,来描述单链表.我们把用数组描述下标的链表叫做静态链表.也叫游标实现法. (2)首先让数组的元素是两个数据域组成,data 和cur.也 ...
- 程序设计C语言-静态链表及指针
程序设计C语言的学习笔记,静态链表的指针实现 struct Student {int num;float score;struct Student *next; }; struct Student s ...
- 树的同构(c语言静态链表实现)
题目 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子 ...
最新文章
- sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息
- 计算机网络:第三章 数据链路层
- docker容器间数据共享
- 改进博客园Markdown显示功能(加代码行号、显示代码所用编程语言)
- idea导入maven项目依赖报错_解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?
- JavaScript之BOM对象(JS函数作用域、window、history、location对象)
- SpringCloudConfig分布式配置中心-基本使用
- 【并查集】Union Find
- 1059: [ZJOI2007]矩阵游戏 - BZOJ
- DTD(Document Type Definition) 简介
- Promise.all的深入理解
- 关闭appleid双重认证_苹果官方科普来了:全面认识Apple ID
- WinForm 无边框窗体四周阴影 窗体可拖动 无边框自定义标题栏
- 中国大学计算机专业排名教育部,中国校友会网2018中国大学计算机类各本科专业排行榜...
- Java电商平台-电商订单系统全解析
- 【JavaScript练习】实现数组按照数组项中userName中的姓名拼音排序
- ftp服务器 修改文件,ftp服务器修改文件属性的权限
- 狂神css视频笔记1-15课
- 搜索官方的一篇相关性文章分享
- 【C语言】字符数组的定义及使用
热门文章
- 【Elasticsearch】es 快照 snapshot 操作实战
- 【MySQL】MySQL 数据库表锁和行锁
- 【Clickhouse】Clickhouse 分析函数 window functions 窗口函数
- 【Elasticsearch】es 各种 日志 慢日志 慢查询
- 【MySQL】mysql 数据库名称 中间带有中划线问题
- Spring : Spring Aop JDK动态代理调用过程
- spark学习-42-Spark的driver理解和executor理解
- for和foreach
- Cloud Native的设计哲学理念,kubernetes云生态操作系统
- 他35k月薪,如何扛住redis面试!