数据结构 - 表插入排序 具体解释 及 代码(C++)
版权声明:本文为博主原创文章,未经博主同意不得转载。
https://blog.csdn.net/u012515223/article/details/24323125
表插入排序 具体解释 及 代码(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 <iostream>
#include <climits>
#include <deque>
using namespace std;
//打印排序的序列
void printSeq(const std::deque<int>& vals, std::deque<int>& ptrs) {
int t = 0;
for (std::size_t i=0; i<vals.size(); ++i) {
t = ptrs[t];
std::cout << vals[t] << " ";
if (ptrs[t] == 0) {
break;
}
}
std::cout << std::endl;
}
//打印数组
void print(const std::deque<int>& L) {
for (auto i : L) {
std::cout << i << " ";
}
std::cout << std::endl;
}
//表插入排序
void ListInsertSort(const std::deque<int>& vals, std::deque<int>& ptrs) {
const int length(vals.size());
ptrs.resize(length);
ptrs[0] = 1;
ptrs[1] = 0;
for (int i=2; i<length; ++i) {
int t = 0; //从0開始查找
int pre = 0; //记录前一个指针
for (int j=0; j<i-1; ++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<int>& vals, std::deque<int>& ptrs) {
const int length(vals.size());
int t = 0;
int pre = 0;
t = ptrs[t];
for (int i=1; i<length; ++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<int> vals = {INT_MAX, 49, 38, 65, 97, 76, 13, 27, 49};
std::deque<int> 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++)的更多相关文章
- 数据结构 - 2-路插入排序 具体解释 及 代码(C++)
2-路插入排序 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24267679 2-路插入排序的思想非常有意思 ...
- 数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++)
数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2 ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 数据结构 - 归并排序(merging sort) 具体解释 及 代码
归并排序(merging sort) 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包括2-路归并排序 ...
- 数据结构 - 树形选择排序 (tree selection sort) 具体解释 及 代码(C++)
树形选择排序 (tree selection sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 算法逻辑: 依据节点的大小, ...
- 数据结构 - 堆排序(heap sort) 具体解释 及 代码(C++)
堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤: 第一步: 是建立大顶堆(从大到小排 ...
- 数据结构->直接插入排序
数据结构->直接插入排序 实现效果 从小到大排序 算法原理 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序. 算法步骤 从第一个元素开始,该元 ...
- 【排序】表插入排序算法(C语言版)
排序耗时的操作主要分为两种:查找比较.记录移位. 1.表插入排序 在查找比较基础上,尽量减少记录移位步数,可以令排序操作耗时降低,表插入排序正是为减少移位次数而出现的. 在数据结构上,数据是存储在静态 ...
- Python - 首字母大写(capwords) 和 创建转换表(maketrans) 具体解释
首字母大写(capwords) 和 创建转换表(maketrans) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27 ...
随机推荐
- ssm实现图片上传
在使用ssm完成前后端对接时,总免不了前台传过来的文件问题,而html中的<input>框直接使用时,往往会获取不到路径,今天在完成图片上传后的来做个总结 首先,前台页面 <!DOC ...
- sql语句的删除
SQL中delete * from 和 delete from 有什么区别? 在SQL Server中两者没有区别,但在Oracle和MySQL的SQL语句中,delete * from是不标准的语法 ...
- IntelliJ IDEA运行eclipse的web项目报错的问题
用IDEA已经有一段时间了, 由于之前的IDEA版本不支持Tomcat服务器, 所以很长一段时间web项目都是由eclipse开发调试. 今天闲来无事下载了一个最新版的IDEA, 按网上的教程, 尝试 ...
- zt 正则
http://deerchao.net/tutorials/regex/regex.htm 正则表达式30分钟入门教程 版本:v2.3.5 (2017-6-12) 作者:deerchao 转载 ...
- 金蝶k/3 现金流量表编制口诀
现金流量表编制口诀 现金流量表是会计考试中十分令人头疼的内容,丢三落四是现金流量表编制中最容易出现的错误.下面的口诀基本上概括了现金流量表的全部编制过程.口诀的具体内容如何理解,我们在口诀后边详细阐述 ...
- Docker发布程序那些事
最近使用docker比较频繁,所以也难免碰到一些坑,在这里记录一下,给自己写个笔记 1.docker 1.13.0版本不支持docker stack deploy -c 多个 -c的yml文件合并 如 ...
- js分析 猫_眼_电_影 字体文件 @font-face
0. 参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face 这是一个叫做@font-face 的CSS @规则 ,它允许网页开发 ...
- 记一次Mysql魔鬼实训
1.查看某个Mysql数据库当前使用的字符集 show create database [库名称] 2.查看当前书库版本信息 #mysql -V MariaDB [(none)]> use my ...
- webpack打包后访问不到json文件
一.问题描述 在vue中,前端写ajax假数据,用axios将json数据渲染到组件中,开发期间一切正常,webpack打包压缩后,json文件的路径错误,页面访问不到数据,导致渲染失败. 二.预期结 ...
- [是男人就过8题——Pony.ai]Perfect N-P Arrays
[是男人就过8题--Pony.ai]Perfect N-P Arrays 题目大意: 一棵\(n(\sum n\le5\times10^6)\)个结点的树,每个结点都有一个括号.求树上一个合法的括号序 ...