【排序】表插入排序算法(C语言版)
排序耗时的操作主要分为两种:查找比较、记录移位。
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语言版)的更多相关文章
- 插入排序---希尔插入排序算法(Javascript版)
取一个小于n的整数作为第一个增量,把序列分组.所有距离为增量的倍数的元素放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量(第二个<第一个)重复上述的分组和排序,直至所取的增量=1, ...
- 插入排序---直接插入排序算法(Javascript版)
将n个元素的数列分为已有序和无序两个部分. 数列:{a1,a2,a3,a4,…,an} 将该数列的第一元素视为有序数列,后面都视为无序数列: {{a1},{a2,a3,a4,…,an}} 将无序数列中 ...
- 数据结构1:数据结构与算法C语言版分析概述
本节开始将带领大家系统地学习数据结构,作为一门计算机专业大二学生的必修课程,该课程面对的目标人群为初步具备基本编程能力和编程思想的程序员(大一接触了 C 语言或者 C++).通过系统地学习数据结构,可 ...
- 快速排序算法C语言版
快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比 ...
- 快速排序的一种实现(Mark Allen 数据结构与算法 c语言版)
之前关于快速排序一直比较模糊,网上有几种常见写法: 方法一: void quickSort(int s[], int l, int r) { if (l< r) { int i = l, j = ...
- 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法
PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...
- 插入排序(C语言版)
#include<iostream>using namespace std;int n;void lan(int a[],int size){ for(int i = 0;i < s ...
- 《数据结构与算法(C语言版)》严蔚敏 | 第四章课本案例
//二叉树的顺序存储表示 #define MAXTSIZE 100 typedef TElemtype SqBiTree[MAXTSIZE]; SqBiTree bt; //二叉树的二叉链表存储表示 ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
随机推荐
- CDT+Eclipse代码自动提示
1.查看GCC的版本:$gcc -v————————————————————————gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)———————— ...
- UVa10653.Prince and Princess
题目连接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅱ
3.1.2 有序的符号表 典型的应用程序中,键都是Comparable的对象,因此可以使用a.compare(b)来比较a和b两个键.许多符号表的实现都利用Comparable接口带来的键的有序性来更 ...
- SpringMVC学习系列- 表单验证
本篇我们来学习Spring MVC表单标签的使用,借助于Spring MVC提供的表单标签可以让我们在视图上展示WebModel中的数据更加轻松. 一.首先我们先做一个简单了例子来对Spring MV ...
- ssh登录失败处理步骤
如果登录失败而又找不到显示的原因,优先使用ssh -vT name@ip -p port 进行调试,查看所使用的key文件.ip.端口是否正确.然后再检查下面步骤:1.检查在对应用户名下是否有iden ...
- js实现a标签超链接提交form表单的方法
<a class="regButton" id="saveRegister" onclick="document.getElementBy ...
- 要理解javascript中间apply和call
apply和call它是javascript一个非常重要的方法,.虽然与程序平时很少接触,但JS到处都在使用这个框架2方法. 2个方法是在Function.prototype中.也就是说每一个JS函数 ...
- Unity 定时开启/关闭外部应用
自从加入工作的队伍里,博客都荒废了,今天周末,难得清静,写篇博客!刚才看到了Process类,随手写了个小demo.给大家分享下! 首先大家要对Process类有一些简单的了解,参考资料:https: ...
- .NET基础拾遗(1)类型语法基础和内存管理基础1
一.基础类型和语法 1.1 .NET中所有类型的基类是什么? 在.NET中所有的内建类型都继承自System.Object类型. 1.2 值类型和引用类型的区别? 在.NET中的类型分为值类型和引用类 ...
- StackOverflow程序员推荐:每个程序员都应读的30本书
“如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西.” 很多程序员响应,他们在推荐时也写下自己的评语. ...