持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
👨🎓作者简介:一位喜欢写作,计科专业的大三菜鸟
🏡个人主页:starry陆离 的个人主页
如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦
排序
基本概念
- 排序:是指将一组数据元素按某个数据项值排列成一个有序序列的过程
- 记录:待排序的数据元素
- 排序表(序列):待排序的所有记录
- 排序码(关键码):作为排序依据的数据项
稳定排序和非稳定排序
- 稳定排序:在按非主关键码的排序中,使关键码相同的记录的相对位置在排序前后保持不变(一个排序是稳定的,则对任何序列都是稳定的)
- 非稳定排序:在按非主关键码的排序中,使关键码相同的记录的相对位置在排序前后可能发生变化(判断一个排序是非稳定排序,只需找出这种排序方法对于某序列不稳定,即举一个反例即可)
- 若排序码是主关键码,则对于 任意待排序序列,排序后得到的结果是唯一的
内部排序和外部排序
- 内部排序:待排表完全存放在内存中所进行的排序过程
- 外部排序:待排表不能同时进入内存,排序过程需多次访问外存储器调取数据的排序过程
直接插入排序
- 动图演示(图源百度)
2.完整代码
#include<stdio.h>
#define MAXNUM 100//排序表的存储大小
#define keytype int//关键字类型
typedef struct
{
keytype key;//关键码字段
}datatype;//记录的类型
datatype R[MAXNUM];//定义排序表的存储
void D_InsertSort(datatype R[],int n)
{//对排序表直接插入排序,n是记录的个数
int i,j;
for(i=2;i<=n;i++)
{
if(R[i].key<R[i-1].key)
{
R[0]=R[i];//R[0]为监视哨
for(j=i-1;R[0].key<R[j].key;j--)
R[j+1]=R[j];//后移记录
R[j+1]=R[0];//插入到适合位置
}
}
}
int main()
{
int i,num;
datatype R[MAXNUM];
printf("输入记录的个数:\n");
scanf("%d",&num);//输入记录的个数
printf("输入所有的记录:\n");
for(i=1;i<=num;i++)//保留r[0]为空,用作监视哨
scanf("%d",&R[i]);
D_InsertSort(R,num);//调用插入排序函数
printf("%d",R[1]);
for(i=2;i<=num;i++)
printf(" %d",R[i]);
printf("\n");
}
3.样例输出
4.性能分析
- 空间复杂度:仅使用了辅助单元R[0]作为监视哨,空间复杂度为O(1)
- 时间复杂度:O(n^2)