【排序】表插入排序算法(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 编译 ...
随机推荐
- Poj2761-Feed the dogs(伸展树求名次)
Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs ...
- 炫酷吊炸天的nodeppt
由于要做一个关于node的分享,要准备写一个ppt方便就行交流.之前用的比较多的是slides(http://www.slides.com),最近知道了一个node写的工具,可以生成ppt,号称很强大 ...
- debian下编译libev库
系统为Linux debian 2.6.32-5-686.这是裸系统,连xwindows都没有.帐户为root,不是的注意一下权限.这里想说明安装过程及出现的问题,故打印的信息较多,以供出现错误的读者 ...
- [RxJS] Using Observable.create for fine-grained control
Sometimes, the helper methods that RxJS ships with such as fromEvent, fromPromise etc don't always p ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...
- OpenGL——点的绘制(使用OpenGL来绘制可旋转坐标系的螺旋线)
package com.example.opengl1; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio. ...
- hdoj 1863 畅通工程 最小生成树---prime算法
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1863 注意有可能出现无法生成树的情况. #include <iostream> #inclu ...
- xtrabackup备份恢复测试
http://blog.chinaunix.net/uid-20682026-id-3319204.html
- iOS textfield限制长度,中文占2字符,英文占1字符
之前遇到一种情况,限制textfield长度,并且要适配多语言,做到,例如中文占2字符,英文占1字符,还有考虑其他语言,网上找了很多方法,不太合适,最后结合网上的方案,修改出了还比较适用. 首先,增加 ...
- Chrome开发者工具详解 (5):Application、Security、Audits面板
Application面板简介 该面板主要是记录网站加载的所有资源信息,包括存储数据(Local Storage.Session Storage.IndexedDB.Web SQL.Cookies). ...