神的规范:排序算法(一):简单插入排序

本文介绍了简单插入排序的基本思想及其实现过程,通过示例代码详细解释了算法的工作原理,并对其效率进行了评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:
排序又称为分类,它是数据处理中经常用到的一种重要运算。
虽然并未列入世界最伟大的几大算法之一,但毫无疑问,在各行各业的各个时期排序都是作为奠基者般的存在为程序所调用,也为编程者所敬仰。只是,也许正是因为它与我们息息相关,以至于我们竟然时常忽略它的存在。
事实上我们生活中无时无刻不在做排序:考试成绩排名,按身高、年龄、能力高低去评判他人,划分任务处理的优先级,等等·······
今天我们从“简单插入排序”开始,一步步去探索排序算法如何一步步在反思中前进,在山重水复处柳暗花明。

为简单起见,我们采用顺序存储的结构存放所排序的数据元素序列。

简单插入排序可能使我们在生活中不经意用到的最为广泛的排序算法了。为什么呢?我们先来看简单插入排序算法的基本思想:
将n个数据元素的序列分为两部分,一部分是{R1,…,R(i-1)}为已排好序的有序部分,另一部分是{Ri,…,Rn}为未排序的无序部分。这时,将未排序部分地第一个元素Ri依次与有序部分中的元素比较,将其插入到合适位置,使得{R1,…,Ri}成为新的有序部分。
一开始,令i=2。因一个元素自然有序,所以{R1}自然就成为一个有序部分,未排序部分就是{R2,…,Rn},然后依次将R2,…Rn插入到有序部分中,就能得到整个有序数列。

既然如此,我们不难给出插入排序算法的C语言描述(假设待排序元素为整形数据):

void insertsort(int a[],int num) {
    int i,j,temp;
    for (i = 0;i < num-1;i++) {
        temp = a[i+1];
        j = i;
        while(j > -1 && temp < a[j]) {
            a[j+1] = a[j];            //move bigger number to a bigger location
            j--;                    //Search downside for number to move
        }
        a[j+1] = temp;  //Insert element temp
    }
}

验证代码正确性如下图所示:
这里写图片描述
简单插入排序算法是一种稳定的算法,因为它不改变原序列中排序码相同的元素的相对次序。
接下来我们来考虑简单插入排序算法的效率。在上面的代码运行中,外层for循环需要执行n-1次(注意:不是n次),内层while循环最多执行j次(j从1到n-1变化)。因此在最坏情况下,算法需要进行的数据元素比较次数为1+2+…+n-1 = n(n-1)/2,算法效率为O[n^2]。
另外,简单插入排序需要进行数据的移动,最坏情况下需要移动的次数也是n(n-1)/2,这是这一算法的最大不足(移动开销大)。

当然,简单插入排序是一种非常自然的思想,在后面,我们还会陆续分享其他的排序算法。下一节是简单选择排序,我们将会看到,它和插入排序虽为同门师兄弟,却有着迥乎不同的武艺。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值