数据结构 - 表插入排序 详解 及 代码(C++)
来源:互联网 发布:阿里云个人邮箱登录 编辑:程序博客网 时间:2024/06/04 01:34
表插入排序 详解 及 代码(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
10 0
- 数据结构 - 表插入排序 详解 及 代码(C++)
- 数据结构 - 2-路插入排序 详解 及 代码(C++)
- 数据结构 - 直接插入排序(Straight Insertion Sort) 详解 及 代码(C++)
- 数据结构 - 折半插入排序(Binary Insertion Sort) 详解 及 代码(C++)
- 数据结构 - 希尔排序(Shell's Sort) 详解 及 代码(C++)
- 数据结构 - 冒泡排序(Bubble Sort) 详解 及 代码(C++)
- 数据结构 - 快速排序(Quick Sort) 详解 及 代码(C++)
- 数据结构 - 堆排序(heap sort) 详解 及 代码(C++)
- C++代码,数据结构-内部排序-插入排序-表插入排序
- 插入排序 --C数据结构
- 【数据结构&&算法系列】插入排序简单介绍及python代码
- C语言-数据结构-插入排序及优化-源代码
- 数据结构 - 简单选择排序(simple selection sort) 详解 及 代码(C++)
- 数据结构 - 树形选择排序 (tree selection sort) 详解 及 代码(C++)
- 数据结构--插入排序(C语言)
- 数据结构 查找及排序算法、直接插入排序及顺序查找(c语言实现)
- 数据结构排序系列详解之一 插入排序
- C++代码,数据结构-内部排序-插入排序-直接插入排序
- Linux中inode的理解
- Libcurl使用OpenSSL编译出现undefined reference to `COMP_CTX_free'错误备忘
- 在asp.net中使用excel模板
- 二叉树的遍历
- 为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
- 数据结构 - 表插入排序 详解 及 代码(C++)
- 一个小问题。
- jquery的ajax请求与springMVC交互
- 什么是反向代理?
- 使用js判断是手机访问还是电脑访问
- 获取屏幕尺寸大小和密度
- python统计汉字词频
- struts2+spring+hibernate整合
- JAVA基础---数组的创建及遍历