排序算法—插入排序(含C语言代码示例)

一、算法简介

        插入算法作为几大经典的排序算法之一,它的性能在其中算是比较不错的了(主要是稳定);

        插入算法的基本原理就是在一串乱序的数字中,首先认为第一个数是有序的,然后从第二个数开始比较,每次比较都与前面排好序的部分由后往

前进行比较;比如第二个数和第一个数比较,然后第三个数和先和第二个数比较然后在和第一个数比较,第四个数先和第三个数比较然后再分别和第

二、第一个数比较。

        如果在比较的过程中遇到的后一个数比自己大而前一个数比自己小那么就把自己插入到这两个数之间,然后结束这一轮排序进入下一轮;比如说

当我是第五个数的时候,我和第三个数比较,它比我大,而我和第二个数比较,它却比我小,那么我就插入到第二个、第三个数中间,然后进入下一

轮排序。

        如果当前的数比第一次比较的数都大,那么直接插入到该数后面(也就是相当于原地不动),然后进入下一轮排序;比方说我是第三个数,那么

现在我首先要和第二个数进行比较,如果我比它大,而它又是我第一次比较的数,那么我就直接插入到它后面(也就相当于原地不动),然后进入下

一轮排序。

        如果当前的数比最后一次比较的数(也就是这个序列当前的第一个数)都小的话,那么就直接将自己插入到这个数的前面(也就是将自己插入到

当前这个序列的第一个数前面成为序列的第一个数);比如说我是第四个数,在排序比较的时候,我比前三个数(第三、第二、第一)都小的话,那

么我就插入到第一个数前面成为当前序列的第一个数。

二、算法例子

        假如有这样一串数字:2,4,7,5,1,14,11,14,13;我们要将他用插入排序进行升序排列;那么我们将按以下步骤进行(每轮排序确定好一个数字的

位置):

        (1)第一轮排序首先确定2是已排好序的,我们将4拿来进行插入排序,4进行第一轮排序的第一次排序和2比较,显然4比2大,而这又是第一次

也是本轮的最后一次比较,所以将4插入到2后面(即原地不动),此时的序列仍然是2,4,7,5,1,14,11,14,13,然后进入第二轮排序;

        (2)第二轮排序开始,首先在第一轮排序中2,4这前两位是排好序的,我们现在将7拿出来和前面排好序的部分进行对比调位,首先在本轮的第

一次排序和4比较,显然7比4大,所以直接将7插入到4后面(即原地不动),此时的序列也仍然是2,4,7,5,1,14,11,14,13,然后结束本轮排序进入第三

轮排序;

        (3)第三轮排序,将5和前面排好序的三个数进行对比调位,本轮的第一次比较5比7小,进行第二次比较,5比4大,所以将5插入到4和7之间,

此时的序列变成了2,4,5,7,1,14,11,14,13,然后结束本轮排序进入第四轮排序;

        (4)第四轮排序,将1和前面排好序的4个数进行对比调位,因为1比前面的四个数都小,所以在经过4次比较后,将1插入到此时序列的第一个

数(即2)的前面,然后此时的序列变成了这样:1,2,4,5,7,14,11,14,13,然后我们结束本轮排序进入第五轮排序;

        (5)第五轮排序,将14和前面的5个排好序的部分进行对比调位,本轮的第一次排序14和7比较,显然14比7大,所以将14插入到7后面(即位

置不变),此时的序列是1,2,4,5,7,14,11,14,13,然后结束本轮排序进入第六轮排序;

        (6)第六轮排序,将11和前面排好序的6个数进行对比调位,本轮的第一次排序11和14比较,显然11比14小,第二次比较11和7比,显然11比7

大,所以将11插入到7和14中间,此时的序列变成了:1,2,4,5,7,11,14,14,13,然后结束本轮排序进入第七轮排序;

        (7)第七轮排序,将14和前面排好序的7个数进行对比调位,本轮的第一次排序14和14进行对比,显然两数相等,所以保持位置不变,即序列

此时仍是:1,2,4,5,7,11,14,14,13,然后结束本轮的排序进入第八轮也即是最后一轮排序;

        (8)第八轮排序,将13和前面排好序的8个数进行对比调位,本轮的第一次排序13和14进行对比,显然13小于14,第二次排序13和另一个14对

比,仍然小于14,第三次排序13和11对比,显然13大于11,所以将13插入到11和第二次比较的14之间,此时的序列即为最终排序完成的序列:

1,2,4,5,7,11,13,14,14;

三、插入排序视频详解

插入排序视频详解

四、代码样例

void mysort(int *index,int length)
{
    int temp;
    for(int i = 1;i < length;i++)
    {
        int j = i - 1;
        temp = index[i];
        while(index[j] > temp && j >= 0)
        {
            index[j+1] = index[j];
            j--;
        }
        index[j+1] = temp;
    }
}

  • 12
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云日松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值