【排序】表插入排序算法(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 编译 ...
随机推荐
- 【转】用Device tree overlay掌控Beaglebone Black的硬件资源
原文网址:https://techfantastic.wordpress.com/2013/11/15/beaglebone-black-device-tree-overlay/ 经过一晚上的Goog ...
- Java数据结构: java.util.BitSet源码学习
接着上一篇Blog:一道面试题与Java位操作 和 BitSet 库的使用,分析下Java源码中BitSet类的源码. 位图(Bitmap),即位(Bit)的集合,是一种常用的数据结构,可用于记录大量 ...
- 方案:解决 wordpress 中 gravatar 头像被墙问题
Gravatar头像具有很好的通用性,但是却遭到了无辜的拦截,对于无法加载头像URL,我们在WordPress系统中通过修改默认的URL链接可以达到恢复头像的功能. 修改文件路径为 /wp-inclu ...
- 【HDU1162】Eddy's picture(MST基础题)
很基础的点坐标MST,一不留神就AC了, - - !! #include <iostream> #include <cstring> #include <cstdlib& ...
- OpenStack Mixture HypervisorsDriver configure and implementation theory
通过本文,您将可以了解在 OpenStack 中如何进行混合 Hypervisor 的配置及其实现原理的基本分析.本文主要结合作者在 Nova 中的实际开发经验对 OpenStack 中混合 Hype ...
- 最详细的 HTTPS 科普扫盲帖
为什么需要https HTTP是明文传输的,也就意味着,介于发送端.接收端中间的任意节点都可以知道你们传输的内容是什么.这些节点可能是路由器.代理等. 举个最常见的例子,用户登陆.用户输入账号,密码, ...
- POJ 2010 Moo University - Financial Aid 优先队列
题意:给你c头牛,并给出每头牛的分数和花费,要求你找出其中n(n为奇数)头牛,并使这n头牛的分数的中位数尽可能大,同时这n头牛的总花费不能超过f,否则输出-1. 思路:首先对n头牛按分数进行排序,然后 ...
- 特殊权限:SUID,SGID,Sticky
特殊权限passwd:s SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者: chmod u+s FILE chmod u-s FILE 如果FIL ...
- phpcms 内部检测用户名长度更改
<?php /*1.js部分ajax就不说了,很好改...把min max更改下就行了具体在三个地方更改: inputValidator({min:2,max:40, //默认是20 1.会员 ...
- pyQt事件处理
Qt事件处理01 Qt处理事件的第二种方式:"重新实现QObject::event()函数",通过重新实现event()函数,可以在事件到达特定的事件处理器之前截获并处理他们.这种 ...