1.表插入排序只是求得一个有序的链表,它是修改指针的值来代替移动记录,操作过程如下

2.但是这样只能进行顺序查找,不能进行随机查找,为了能实现有序表的折半查找,需要对记录进行重新排列。操作过程如下:

3.测试程序如下:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef struct xxx{int head;//头结点 int a[100];int next[100];//记录下一个元素的位置 int len;xxx(){head = 1;memset(next, 0, sizeof(next));}void outList(){for(int i=1; i<=len; ++i){cout<<a[i]<<" ";}cout<<endl;}
}Listx; Listx Lx;void table_insertion_sort(){//表插入排序,相当于静态链表 for(int i=2; i<=Lx.len; ++i){int pre, p;for(p=Lx.head; p && Lx.a[p]<Lx.a[i]; pre=p, p=Lx.next[p]);if(p==0){Lx.next[pre] = i;} else if(p==Lx.head){Lx.next[i] = Lx.head;Lx.head = i;} else {Lx.next[pre] = i;Lx.next[i] = p;} }//输出for(int i=Lx.head; i; i = Lx.next[i]) cout<<Lx.a[i]<<" ";cout<<endl;
}void arrang_table() {int p = Lx.head, q;for(int i=1; i<Lx.len; ++i){while(p < i) p = Lx.next[p];//第i个记录在表中的位置不应该小于 i,如果小于i,说明该元素已经被交换位置了,可以通过next继续寻找 q = Lx.next[p];//指向下一个节点 if(p!=i){//第p个元素应该在第i个位置
            swap(Lx.a[i], Lx.a[p]);swap(Lx.next[i], Lx.next[p]);Lx.next[i] = p;//该元素之前的位置 p,指向被移走的记录,使得以后可由while循环找回
        }p = q;}for(int i=1; i<=Lx.len; ++i) cout<<Lx.a[i]<<" ";cout<<endl;
}int main()
{int i;scanf("%d", &Lx.len);for(i=1; i<=Lx.len; i++)scanf("%d", &Lx.a[i]);table_insertion_sort();arrang_table();return 0;
}

转载于:https://www.cnblogs.com/hujunzheng/p/4677484.html

插入排序之表插入排序相关推荐

  1. c语言 静态链表插入排序,数据结构 - 表插入排序 具体解释 及 代码(C++)

    表插入排序 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24323125 表插入排序(List I ...

  2. c语言 静态链表插入排序,数据结构C语言版 表插入排序

    西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...

  3. 插入排序:表折半插入

    在前一篇插入排序:表插入中.我们用静态链表的存储方式.直接插入的策略,构建了一种新的插入排序算法:表插入. 有人可能会想到:相同是静态链表的形式,为什么不使用更高效的折半插入策略呢?这样的想法真的非常 ...

  4. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  5. 表插入排序算法及C语言实现(看了无师自通)

    前面章节中所介绍到的三种插入排序算法,其基本结构都采用数组的形式进行存储,因而无法避免排序过程中产生的数据移动的问题.如果想要从根本上解决只能改变数据的存储结构,改用链表存储. 表插入排序,即使用链表 ...

  6. “神奇“的表插入排序算法

    文章目录 示例代码 时间复杂度: 直接插入排序算法示例如下: 具体可参考书籍: End 说真的,表插入排序算法是我学习插入排序算法中最难理解的算法之一,特意来写博客记录一下,理解思路真的不会写(或许我 ...

  7. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)...

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

  8. 数据结构笔记(三十六)-- 插入排序与直接插入排序

    插入排序 插入排序就是将要排序的表分成有序表和无序表两个部分,在无序表中取一个元素,在有序表中找到其位置,然后将其插入到有序表中.这样的排序算法就是插入排序 一.插入排序的分类 直接插入排序 折半插入 ...

  9. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

最新文章

  1. 取代java_如何评价 Kotlin?未来是否会取代 Java?
  2. 用python画xy散点图-python使用Plotly绘图工具绘制散点图、线形图
  3. 扫描过程_PLC的循环扫描工作过程
  4. Linux时间子系统之二:表示时间的单位和结构【转】
  5. [SpringBoot2]ajax函数中data参数的数据设置方式
  6. Spring中DispacherServlet、WebApplicationContext、ServletContext的关系
  7. html提交表单使用python计算_教你使用Python实现新个税计算器
  8. 服务器重启导致无法启动MySQL
  9. 曲率多项式转换为直角坐标系
  10. SpringBoot maven项目如何打包进行发布?
  11. Hibernate ——二级缓存
  12. Java线程中断理解(interrupte)
  13. sift算法搭建(上半部,五,求二阶三阶黑塞矩阵的逆程序对比,c#实现)
  14. 震旦打印机打不开首选项
  15. 支付宝当面付扫码支付支付后不回调_【支付宝支付】支付宝手机网站支付流程...
  16. 网易云音乐java爬虫_Java爬取网易云音乐民谣并导入Excel分析
  17. java实现微信H5支付和回调的Demo源码
  18. 【Git】规范化 Git 提交信息 Commitizen
  19. 2022年起重机械指挥考试题及模拟考试
  20. ARM如何判断合法的立即数

热门文章

  1. Android自动化打包工具,利用Jenkins实现Android自动化打包
  2. 管理系统中计算机应用 重点章节,11年《管理系统中计算机应用》 第5章 重点要点.doc...
  3. pca主成分分析用matlab实现,PCA (主成分分析)详解 (写给初学者) 结合matlab
  4. docker kibana:7.14.2
  5. docker Gitlab14.5.0 初始化账号以及密码是什么呢?
  6. layui 单选项 点击显示与隐藏 很实用
  7. Hadoop集群安装部署_伪分布式集群安装_01
  8. Git 切换提交历史节点
  9. 国内各大音乐平台歌曲分享
  10. python time sleep和wait_Python和硒:driver.implicitly_wait()和time.sleep()之间的区别...