数据结构 - 表插入排序 具体解释 及 代码(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 ...
随机推荐
- MUI初学1
1.1)官网: http://www.dcloud.io/ 2)案例: http://www.dcloud.io/case/#group-1 3)文档:http://dev.dcloud.net.cn ...
- Centos 7 telnet 详解
telnet命令 telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了.但仍然有 ...
- 在vue-cli3 中import引入一个没有export default{}的js文件
如果这个js文夹,放在vue-cli3中搭建的项目中的,public文件夹下,通过 //.js可以省略不行 import '/public/xxx.js' 其实你在浏览器中看的时候,发现会报错误 : ...
- 使用CompletionService结合ExecutorService批处理调用存储过程任务实例
此实例为java多线程并发调用存储过程实例,只做代码记载,不做详细描述 1.线程池构造初始化类CommonExecutorService.java package com.pupeiyuan.go; ...
- 论文阅读笔记四十六:Feature Selective Anchor-Free Module for Single-Shot Object Detection(CVPR2019)
论文原址:https://arxiv.org/abs/1903.00621 摘要 本文提出了基于无anchor机制的特征选择模块,是一个简单高效的单阶段组件,其可以结合特征金字塔嵌入到单阶段检测器中. ...
- Nhibernate 使用 (一)
一:介绍 NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库.Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具.NHibernate ...
- SQL反模式学习笔记20 明文密码
目标:恢复或重置密码 反模式:使用明文存储密码 1.存储密码 使用明文存储密码或者在网络上传递密码是不安全的. 如果攻击者截取到你用来插入(或者修改)密码的sql语句,就可以获得密码. 黑客获 ...
- KaliLinuxNetHunter教程实施刷机解锁Bootloader
KaliLinuxNetHunter教程实施刷机解锁Bootloader 当用户将前面的工作都准备完成后,即可开始刷机.其中,整个刷机过程分为三个步骤,分别是解锁Bootloader.刷入第三方Rec ...
- CentOS 7 下安装 teamviewer 13
CentOS 版本:centos-release-7-4.1708.el7.centos.x86_64(通过 rpm -q centos-release 查询) teamviewer 版本:teamv ...
- webpack打包后该如何访问项目?
一.问题描述 开发环境,页面浏览都OK,产出文件后,直接打开产出目录的index.html,页面空白. 二.预期结果 能正常看到页面. 三.问题分析 你可能会在编译的最后看到如下一句话: Tip: b ...