排序基础知识与直接插入排序

155 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

👨‍🎓作者简介:一位喜欢写作,计科专业的大三菜鸟

🏡个人主页:starry陆离 的个人主页

如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦

排序

基本概念

  1. 排序:是指将一组数据元素按某个数据项值排列成一个有序序列的过程
  2. 记录:待排序的数据元素
  3. 排序表(序列):待排序的所有记录
  4. 排序码(关键码):作为排序依据的数据项

稳定排序和非稳定排序

  1. 稳定排序:在按非主关键码的排序中,使关键码相同的记录的相对位置在排序前后保持不变(一个排序是稳定的,则对任何序列都是稳定的)
  2. 非稳定排序:在按非主关键码的排序中,使关键码相同的记录的相对位置在排序前后可能发生变化(判断一个排序是非稳定排序,只需找出这种排序方法对于某序列不稳定,即举一个反例即可)
  3. 若排序码是主关键码,则对于 任意待排序序列,排序后得到的结果是唯一的

内部排序和外部排序

  1. 内部排序:待排表完全存放在内存中所进行的排序过程
  2. 外部排序:待排表不能同时进入内存,排序过程需多次访问外存储器调取数据的排序过程

直接插入排序

  1. 动图演示(图源百度)

图源百度

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.性能分析

  1. 空间复杂度:仅使用了辅助单元R[0]作为监视哨,空间复杂度为O(1)
  2. 时间复杂度:O(n^2)