【数据结构基础】直接插入排序
来源:互联网 发布:java notify notifyall 编辑:程序博客网 时间:2024/06/06 15:40
算法描述:
直接插入排序的核心思想是:先比较,找到插入的合适位置后,最后插入。程序结束。
比如给定一行递增的数字:1、5、9、14;然后要在这一行里插入一个数字3,假设我们从后面往前比较,3先和14比较,比14小,14往后摞一位,原来14占的位置空出来了;3再与9比较,比9小,9在往后摞一位,原来14占的位置现在被9占,原来9的位置空出来了;依次类推……3与1比较,3比1大,所以3直接插入到原来5的位置。插入结束。
当出现一堆无序的序列时,我们可以将第一个记录看成是一个有序的序列,从第二个记录开始,都看成是即将要插入的记录。
为了算法代码的普适性,我们给出待排记录的普适的数据类型。
typedef struct{ //每一个记录的数据类型 KeyType key; //关键字项 InfoType otherinfo; //记录中其他的数字项 }RedType; typedef struct{ //记录组成的序列,我们存在顺序表中 RedType r[Maxsize+1]; //r[0]闲置或做哨兵单元 int length; }SqList,*PSqList;
为了方便测试,给出无序序列初始化函数
void InitList(PSqList *L){ *L=(PSqList)malloc(sizeof(SqList)); (*L)->length=0; int recordCount; //无序序列中的记录的个数 scanf("%d",&recordCount); for(int i=1;i<=recordCount;i++){ scanf("%d",&(*L)->r[i].key); (*L)->length++; }}
直接插入核心算法:(C语言描述)
void InsertSort(PSqList * L){ for(int i=2;i<=(*L)->length;i++){ (*L)->r[0]=(*L)->r[i]; while(i>1){ if((*L)->r[i-1].key>(*L)->r[0].key){ (*L)->r[i]=(*L)->r[i-1]; i--; }else{ break; } } (*L)->r[i]=(*L)->r[0]; }}
源代码:
//插入排序算法 #include<stdio.h>#include<stdlib.h>#define Maxsize 20typedef int KeyType; typedef struct{ //每一个记录的数据类型 KeyType key; //关键字项 // InfoType otherinfo; //记录中其他的数字项 ,这里为了简单,我们也可以忽略不计 }RedType; typedef struct{ //记录组成的序列,我们存在顺序表中 RedType r[Maxsize+1]; //r[0]闲置或做哨兵单元 int length; }SqList,*PSqList;void InitList(PSqList *L){ *L=(PSqList)malloc(sizeof(SqList)); (*L)->length=0; int recordCount; scanf("%d",&recordCount); for(int i=1;i<=recordCount;i++){ scanf("%d",&(*L)->r[i].key); (*L)->length++; }} void InsertSort(PSqList * L){ for(int i=2;i<=(*L)->length;i++){ (*L)->r[0]=(*L)->r[i]; while(i>1){ if((*L)->r[i-1].key>(*L)->r[0].key){ (*L)->r[i]=(*L)->r[i-1]; i--; }else{ break; } } (*L)->r[i]=(*L)->r[0]; }}void PrintList(PSqList L){ for(int i=1;i<=L->length;i++){ printf("%d ",L->r[i].key); }}int main(void){ PSqList L; InitList(&L); InsertSort(&L);//直接插入排序 PrintList(L); return 0;}
运行截图:
for(int i=2;i<=(*L)->length;i++){ c1 n (*L)->r[0]=(*L)->r[i]; c2 n-1 while(i>1){ c3 m1 if((*L)->r[i-1].key>(*L)->r[0].key){ c4 m1 (*L)->r[i]=(*L)->r[i-1]; c5 m2 i--; c6 m2 }else{ c7 m3 break; c8 m3 } } (*L)->r[i]=(*L)->r[0]; c9 n-1 }
$m1=
Tn
阅读全文
0 0
- 【数据结构基础】直接插入排序
- {数据结构}直接插入排序
- 数据结构--直接插入排序
- 【数据结构】直接插入排序
- 数据结构---直接插入排序
- 数据结构-直接插入排序
- 数据结构:直接插入排序
- 【数据结构】直接插入排序
- 数据结构----直接插入排序
- 数据结构--直接插入排序
- [数据结构]直接插入排序
- 数据结构---直接插入排序
- 数据结构 直接插入排序
- 数据结构直接插入排序
- 数据结构-插入排序-直接插入排序
- 【基础排序】直接插入排序
- 数据结构之直接插入排序
- 数据结构--直接插入排序实现
- jquery选择器学习
- 判断一个节点是否在二叉树中,判断tree2是否为tree1的子树
- EU4-24: Accidents and injuries
- Dw基础课-网站常见元素及CSS基础(字、链接)
- Linux scp从本地复制到远程和从远程复制到本地的区别
- 【数据结构基础】直接插入排序
- 嵌入式面试总结-C语言函数相关
- 静态代理模式
- jetbrains学生认证接口
- 循环控制
- 求一个数二进制中1的个数
- 操作系统
- select、poll、epoll优缺点总结
- 一般算术表达式转换成后缀式