数据结构 - 表插入排序 具体解释 及 代码(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 ...
随机推荐
- iOS -- Effective Objective-C 阅读笔记 (8)
若想令自己缩写的对象具有拷贝功能, 则需要实现 NSCopying 协议, 如果自定义的对象分为可变版本与不可变版本, 那么就要同时实现 NSCopying 协议和 NSMutableCopying ...
- python 列表 元组 字符串
列表添加: list.append() list.extend() list.insert() 列表删除: list.remove() #删除某一个元素 list.pop() #删除某一个返回删 ...
- python---自己实现双向链表常用功能
这个和单向链表有几个功能是同样的代码. 但在add,insert,append,remove时,由于node拥有prev指针, 所以操作不一样.注意看注释. # coding = utf-8 # 双向 ...
- ansible的lookup
lookup路径: /usr/lib/python2.7/site-packages/ansible/plugins/lookup 所有的lookup插件列表cartesian.py dnstxt.p ...
- Mapreduce的排序(全局排序、分区加排序、Combiner优化)
一.MR排序的分类 1.部分排序:MR会根据自己输出记录的KV对数据进行排序,保证输出到每一个文件内存都是经过排序的: 2.全局排序: 3.辅助排序:再第一次排序后经过分区再排序一次: 4.二次排序: ...
- 20172328 2018-2019《Java软件结构与数据结构》第九周学习总结
20172328 2018-2019<Java软件结构与数据结构>第九周学习总结 概述 Generalization 本周学习了无向图.有向图.带权图.常用的图算法.图的实现策略. 教材学 ...
- SpringBoot使用Sharding-JDBC分库分表
本文介绍SpringBoot使用当当Sharding-JDBC进行分库分表. 1.有关Sharding-JDBC 有关Sharding-JDBC介绍这里就不在多说,之前Sharding-JDBC是当当 ...
- git使用习惯
1.每早一更新,提交前更新 git pull -u origin master: master(master为分支名称) 2.每晚一提交: git add . (注:别忘记后面的.此操作是把文件夹下面 ...
- 那些年我们跳过的 IE坑
一, IE input X 去掉文本框的叉叉和密码输入框的眼睛图标 解: 从IE 10开始,type=”text” 的 input 在用户输入内容后,会自动产生一个小叉叉(X),方便用户点击清 ...
- React(五)State属性
React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM). 以下实例创建一个名称扩展为 React.Component 的 ES6 类,在 rende ...