排序耗时的操作主要分为两种:查找比较、记录移位。

1.表插入排序

在查找比较基础上,尽量减少记录移位步数,可以令排序操作耗时降低,表插入排序正是为减少移位次数而出现的。

在数据结构上,数据是存储在静态数组(表)中,而每个数组除了数据关键字外还记录了表中下一个记录,按记录遍历的关键字则是排序的结果。

如:有如下需要排序的数据:

关键字 5 1 3 2 4
下一个记录的表中位置 - - - - -

排序后得到的表为

关键字 5 1 3 2 4
下一个记录的表中位置 -1 3 4 2 0

这里还需要提到重排记录的方法:

由于重排过程中,需要移动记录的位置,所以"下一个记录的表中位置"则会产生变化,而又因为重排过程中表中不同数据只会被访问一次,所以可以利用失效的"下一个记录的表中位置"记录未被访问的数据且因重排被移位的新位置。

重排时,以i记录已经排好的记录数量,p记录要重拍的关键字,如果p<i,表示要重拍的关键字被移位了,所以再获取表中的"下一个记录的表中位置"即可。

#include <stdio.h>
#include <stdlib.h> typedef struct{
int data;
int next;
}node;
typedef struct{
node *list;
int head;
}table; int main(void){
node *s;
int cnt=0, k, cntmax=10, nexttemp, datatemp, kk;
int head, preindex;
int p,i;
table mytable; s = (node*)malloc(sizeof(node)*10);
while(1){
scanf("%d", &datatemp);
if(datatemp<0)
break;
(s+cnt)->data = datatemp;
cnt++;
if(cnt==cntmax){
s = (node*)realloc(s, cntmax+10);
cntmax += 10;
}
}
mytable.list = s; head = 0;
s->next = -1; //-1表示链表表尾结点
//表插入排序
for(k=1; k<cnt; k++){
kk=head;
while(kk!=-1){
if((s+kk)->data>(s+k)->data){
if(kk==head){
head = k;
(s+k)->next = kk;
}
else{
(s+preindex)->next = k;
(s+k)->next = kk;
}
break;
}
else{
preindex = kk;
kk = (s+kk)->next;
}
}
if(kk==-1){
(s+preindex)->next = k;
(s+k)->next = -1;
}
}
mytable.head = head; for(k=mytable.head; k!=-1; k=(mytable.list+k)->next){
printf("%d ", (mytable.list+k)->data);
}
printf("\n"); //记录重排-->这里是难点~~
for(i=0, p=head; i<cnt; i++){
//i位置结点与k位置结点交换
while(p<i) //----->注意这里哟,逐个找回来
p = (s+p)->next;
k = (s+p)->next; //保存指向的下一个需要重排的关键字位置 if(p!=i){
datatemp = (s+p)->data;
nexttemp = (s+p)->next;
(s+p)->data = (s+i)->data;
(s+p)->next = (s+i)->next;
(s+i)->data = datatemp;
(s+i)->next = p;
} p = k;
}
for(i=0; i<cnt; i++){
printf("%d ", (mytable.list+i)->data);
}
printf("\n"); system("pause");
return 0;
}

其他排序请见后篇

【排序】表插入排序算法(C语言版)的更多相关文章

  1. 插入排序---希尔插入排序算法(Javascript版)

    取一个小于n的整数作为第一个增量,把序列分组.所有距离为增量的倍数的元素放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量(第二个<第一个)重复上述的分组和排序,直至所取的增量=1, ...

  2. 插入排序---直接插入排序算法(Javascript版)

    将n个元素的数列分为已有序和无序两个部分. 数列:{a1,a2,a3,a4,…,an} 将该数列的第一元素视为有序数列,后面都视为无序数列: {{a1},{a2,a3,a4,…,an}} 将无序数列中 ...

  3. 数据结构1:数据结构与算法C语言版分析概述

    本节开始将带领大家系统地学习数据结构,作为一门计算机专业大二学生的必修课程,该课程面对的目标人群为初步具备基本编程能力和编程思想的程序员(大一接触了 C 语言或者 C++).通过系统地学习数据结构,可 ...

  4. 快速排序算法C语言版

    快速排序(Quicksort)是对冒泡排序的一种改进.  快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比 ...

  5. 快速排序的一种实现(Mark Allen 数据结构与算法 c语言版)

    之前关于快速排序一直比较模糊,网上有几种常见写法: 方法一: void quickSort(int s[], int l, int r) { if (l< r) { int i = l, j = ...

  6. 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法

    PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...

  7. 插入排序(C语言版)

    #include<iostream>using namespace std;int n;void lan(int a[],int size){ for(int i = 0;i < s ...

  8. 《数据结构与算法(C语言版)》严蔚敏 | 第四章课本案例

    //二叉树的顺序存储表示 #define MAXTSIZE 100 typedef TElemtype SqBiTree[MAXTSIZE]; SqBiTree bt; //二叉树的二叉链表存储表示 ...

  9. 数据结构C语言版 表插入排序 静态表

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

随机推荐

  1. 【POJ1003】Hangover(二分搜索)

    直接用库函数二分即可. #include <iostream> #include <cstring> #include <cstdlib> #include < ...

  2. c++ windows下declspec

    一.declspec #ifdef STATIC_LIBS #define DLL_API static #else #define DLL_API __declspec (dllexport) #e ...

  3. RedHat安装GCC问题-解决依赖问题

    RedHat Linux在安装gcc时需要cpp和cloog-ppl但是在安装cpp的时候需要这个依赖:libmpfr.so.1()(64bit) is needed by cpp-4.4.6-3.e ...

  4. 【转】ffmpeg中的sws_scale算法性能测试

    经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理.以前一直很懒,懒得测试和甄别应该使用哪种算法,最近的工作时间,很多时候需要等待别人.忙里 ...

  5. Android硬件抽象层(HAL)概要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6567257 Android的硬件抽象层,简单来 ...

  6. 8. 冒泡法排序和快速排序(基于openCV)

    一.前言 主要讲述冒泡法排序和快速排序的基本流程,并给出代码实现,亲测可用. 二.冒泡法排序 冒泡法排序主要是将相邻两个值比较,把小的向前冒泡,大的向后沉淀,时间复杂度为O(n2).主要思想如下: 分 ...

  7. Oracle静默安装-简单记录

    一.与图形界面安装一样,检查如下条件:新建用户.组创建安装目录配置环境变量检查安装依赖包修改内核参数……前面这些操作都属于常规操作,不管是图形还是静默都需要处理. 二./home/oracle/dat ...

  8. 在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象。你可能没有合适的权限”

    在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象.你可能没有合适的权限” 打开组策略管理其它选项提示:找不到指定路径.之前做过的操作:取消域控主机上的共享目录sysvol和 ...

  9. 基于avalon1.4.x ----分页组件编写

    avalon分页组件 (1.4.x版本) 随着avalon2的推出,avalon1的官网已经不再维护了,现在似乎是找不到avalon 1.4版本的官方文档了,所以本文章所有的内容均不保证正确性,只能保 ...

  10. .net下载

    1,Http 协议中有专门的指令来告知浏览器, 本次响应的是一个需要下载的文件. 格式如下: Content-Disposition: attachment;filename=filename.ext ...