排序算法—插入排序

153 阅读2分钟

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

前言

初学排序的人通常会有一些问题

什么是排序?

排序就是将一组杂乱无章的数据按一定的规律顺次排列起来。

排序的目的是什么?

便于查找

排序算法的好坏如何衡量?

  1. 时间效率——排序速度(即排序所花费的全部比较次数)
  2. 空间效率——占内存辅助空间的大小
  3. 稳定性———若两个记录A和B的关键字值相等,但排序后A、B 的先后次序保持不变,则称此排序算法是稳定的

插入排序

插入排序的基本思想是:每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。

插入排序有多种具体实现算法:

  1. 直接插入排序
  2. 折半插入排序
  3. 表插入排序
  4. 希尔插入排序

主要使用的时直接插入排序和希尔插入排序

直接插入排序

直接插入排序是最简单的排序方法

具体的实现步骤是:从前向后遍历元素,在已形成的有序表中线性查找,在合适位置插入。

T=(13,6,3,31,9,27,5,11)

排序过程如下:

image.png

时间复杂度:O(n2) 空间复杂度:O(1) 算法的稳定性:稳定

代码实现:

void Insertsort()
{ 
    int i,j;
    for(i=2;i<=N;i++){ 
        p[0]=p[i];
        j=i-1;
        while(p[0] < p[j]){ 
            p[j+1]=p[j];
            j--; 
        }
        p[j+1]=p[0]; 
    }
}

希尔排序

排序方式:先将整个待排记录序列分割成若干子序列,分别进行直接 插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

注意:子序列的构成不是简单地“逐段分割”,而是将相隔某个 增量dk的记录组成一个子序列,让增量dk逐趟缩短(例如依 次取5,3,1),直到dk=1为止。

后记

接下来的几天里会写几篇文章一起总结排序算法。