博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序-插入排序
阅读量:6070 次
发布时间:2019-06-20

本文共 1747 字,大约阅读时间需要 5 分钟。

hot3.png

零、数据结构和算法系列目录

数据结构和算法系列目录(不断更新):

一、插入排序简介

插入排序是比较简单也比较直接的一种排序算法。对于少量元素待排序数据较为有效。插入排序就像安身高排队,有一个人指挥排队从第二个人开始,按身高把当前的人安插到之前排序好的队列的合适位置。插入排序的每一步是把当前元素插入到已经排好序的相应合适的位置。而整个排序就是从第二个元素开始,依次把当前的元素插入到之前排好序的相应位置。过程实现和简单,但是却与之前讲过的计数排序的原理不一样。插入排序的核心是基于两个数的比较,它是一种比较算法(后面会陆续介绍另外的比较排序)。

二、插入排序的步骤

  1. 从待排序数组的第二个元素开始,把当前第i个元素记录在key中
  2. 从元素的一个元素开始到当前的第i个元素为止,找到第一个比key大的第j个元素
  3. 从第i-1元素开始,用前一个元素覆盖当前元素,直到第j个元素为止。
  4. 把key放入到第j个元素中,继续前面的步骤知道结束。

三、插入排序的一些分析

先说明一下,上面的排序是基于数组数据结构排序进行的,基于链表的过程类似。我们来分析一下插入排序的时间复杂度。可以从上面的步骤中看出,算法的核心主要基于两层循环,不难分析出来其时间复杂度为。前面已经介绍过,插入排序是一种基于比较思想的排序算法,而且按照上述步骤的第二步,即找到第一个比key大的元素,这个就保证了算法的稳定性,但是要是把这个条件改变一下。即改成找到第一个大于等于key的元素,这时算法就不是稳定性的算法了,所以对于边界条件的把握一定要注意。

四、插入排序的例子

实现插入排序算法的原理的例子有很多,这里就不在给出,可自行查找具体的例子实现,如算法导论(参考文献1)中的例子。

五、代码实现

#include 
#include
int main(int argc, char const *argv[]){ int length = 0; int i = 0; int insert_sort(int *, int); while(EOF != scanf("%d", &length)) { int* numbers = (int*)malloc(length * sizeof(int)); for(i = 0; i < length; i++) scanf("%d", &numbers[i]); insert_sort(numbers, length); printf("%d", numbers[0]); for(i = 1; i < length; i++) printf(" <= %d", numbers[i]); printf("\n"); free(numbers); } return 0;}int insert_sort(int *numbers, int length){ int i = 0; int j = 0; int key = 0; for(i = 1; i < length; i++) { key = numbers[i]; for(j = i - 1; j >= 0; j--) { if(key < numbers[j]) numbers[j + 1] = numbers[j]; else break; } numbers[j + 1] = key; } return 0;}

程序比较简单,就不进行详细的讲解了。

六、后续工作

插入排序只是众多排序算法中的一种。其他排序算法会在后面的一些博客中进行总结。

七、参考资料

1. Introduction to Algorithms(Second Edition), Thomas H.Cormen & Charles E.Leiserson

2. Insert Sort, 

说明:

数据结构和算法博客系列的目录为:

如有错误还请各位指正,欢迎大家一起讨论给出指导。

上述程序完整代码下载链接:

最后更新时间2013-07-05

转载于:https://my.oschina.net/liuzeli/blog/142788

你可能感兴趣的文章
重庆构建互联互通新格局 从内陆腹地迈向开放前沿
查看>>
市场监管总局:把校园食品、保健食品作为监管重中之重
查看>>
成都动车段134组动车全面“体检”迎接春运
查看>>
韩国流行家中饮酒 2018年每家每月平均饮酒近6次
查看>>
隐藏黑钻数,修改前十榜单,网易星球给所有相信区块链的人一巴掌
查看>>
通过一个案例理解 JWT
查看>>
独家 | 日本机器学习领军人杉山将:为什么说弱监督学习是未来的热门?
查看>>
【火炉炼AI】机器学习020-使用K-means算法对数据进行聚类分析
查看>>
Python记一次自动脚本历程
查看>>
MVP+Kotlin源码体验
查看>>
makefile--伪目标语法与编程实例
查看>>
看完这个你还不会 插入排序 么
查看>>
Android-压缩大图到容量超小的图片
查看>>
聊聊springboot的HeapDumpWebEndpoint
查看>>
Flux OOM实例
查看>>
Jenkins进阶系列之——01使用email-ext替换Jenkins的默认邮件通知
查看>>
从零搭建自己的SpringBoot后台框架(十一)
查看>>
基本排序算法
查看>>
ES6走走看看—由块级作用域引出的一场变革
查看>>
百度学术改版与 CPU 100% 有关系么?
查看>>