经过一个假期对基础算法知识的学习,总算在近期告一段落,正好在刚开学的这一段冷却期,为了加深对算法的记忆与理解,准备对假期所学习的算法知识进行一定的总结与分析,算是对前一阶段所学知识的总结吧,也许在这期间还能发掘出当初没有想到的想法,算是很随性的总结吧,那么从今天开始,便由浅入深的对基本的算法进行一定的复习。

在这篇文章中将介绍一个非常简单的排序算法—插入排序算法(Insertionsort)。插入排序的算法的核心便在于原地排序。所谓原地排序指的是,在算法的运行过程中,在待排序对象的容器外仅仅有确定个数的对象。就像我们在桌子上放了一副扑克牌,我们想把每张牌按照牌上数字的大小按照非降序顺序排列之后堆叠在桌上,那么什么叫原地排序呢,我们把放牌堆的桌子认为是盛放牌的容器,我们的双手认为是牌堆之外的空间,我们在排序的过程中,每次仅仅在牌堆里面取得1张牌和牌堆里面的扑克牌进行比较后找到其应当所在的位置之后放回牌堆,然后再取下一张牌~~~如此反复,在算法的每一步在手中牌的数目是一定的,当然不一定非要是一张啦。这么做的好处便是能够有效的节省内存的占用,如果系统的内存资源紧张,这么做的意义是非常明显的。

那么我们首先对算法的具体步骤进行介绍,该算法的代码实现如下:

public class InsertionsortTest {/*** 插入排序算法实现* * @param tempNumbers 待排序数组* @return*/public static int[] insertionSort(int[] tempNumbers){for(int index = 1; index < tempNumbers.length; index++){//从待排序数组第二个元素开始向前作比较int target = tempNumbers[index];//取得目标元素int targetIndex = index - 1;//待比较元素初始化位目标元素前一个while(targetIndex >= 0 && target < tempNumbers[targetIndex]){//当待比较元素未越界且待比较元素大于目标元素tempNumbers[targetIndex + 1] = tempNumbers[targetIndex];//将待比较元素向后移动一位targetIndex --;//把前一个元素作为下一个待比较元素}tempNumbers[targetIndex + 1] = target;//当待比较元素小于目标元素时,讲目标元素插入至待比较元素之后}return tempNumbers;//返回已排列好的数组}/*** @param args*/public static void main(String[] args) {int[] tempNumbers = {4,1,7,13,11,57,14,6,58};int[] targetNumbers = InsertionsortTest.insertionSort(tempNumbers);System.out.println(Arrays.toString(targetNumbers));}}

算法的运行过程很简单,具体步骤的意义已经在注释中进行了解释,总体的运行过程就像给扑克排序一样,把元素容器的第二个元素开始的元素作为目标元素,把目标元素与之前的元素进行比较,把之前的元素作为待比较元素若待比较元素大于目标元素便把待比较元素后移一位,并把它原来的前一个元素作为新的待比较元素,直到待比较元素小于目标元素,便把目标元素插入至待比较元素之后。在算法的整个过程中在元素容器之外的元素只有一个当前的目标元素,因此这种排序方法是原地的,能够有效的节省内存的使用。

然而这种算法也有其缺点,那就是只适合小规模数据的排序,对于大规模数据的排序效率便不令人满意了,因为其时间复杂度是O(n2)级别的,既然是n方级别的,那么随着输入数据数量级的增长,其排序所需时间的增长过于巨大,效率不能令人满意。在处理小规模数据的过程中效率还是可观的,因此,有人的想法便是利用分治法将大规模的数据分解成小规模的数据集,进行排序之后再进行排序。

虽说算法的效率不算太高,不过毕竟是入门算法,而且实现简单,在平时数据量很小时还是能很好的解决问题的,至于比较高效的算法,实现复杂度也会相应的提高,那么我们应该在以后的文章中能够见到。

基础算法复习篇(一)——插入排序算法相关推荐

  1. 【数据结构----笔记4】插入排序算法之【折半插入排序算法】

    /*__________________________________________________________________________________________________ ...

  2. 排序算法第二篇——折半插入排序

    算法描述: 在上一篇插入排序算法中,已经提到,插入排序的核心是在有序的集合中找到要插入的位置.所以,在这里介绍一种对插入排序的改进算法,即折半插入排序.折半插入排序是指利用折半查找的算法,在有序集合中 ...

  3. 漫画算法python篇_漫画算法:小灰的算法之旅(Python篇)(全彩)

    商品参数 漫画算法-小灰的算法之旅(Python篇) 定价 79.00 出版社 电子工业出版社 版次 出版时间 2020年03月 开本 16开 作者 魏梦舒 装帧 平装-胶订 页数 字数 ISBN编码 ...

  4. 算法设计与分析 ——插入排序算法与归并排序算法比较

    插入排序算法与归并排序算法比较 实验目的 通过插入排序算法与归并排序算法效率对比体会算法在求解问题中的重要性. 实验内容 分别编写函数实现插入排序算法和归并排序算法: 利用随机函数产生大量数据存入数组 ...

  5. 算法入门篇八 贪心算法

    牛客网 左程云老师的算法入门课 贪心算法 贪心算法的解题步骤  例子 题目要求  解题策略 按照结束时间早的会议先安排,比如先安排[2,4],当4结束了,所有开始时间小于4的全部淘汰,[1,7].[3 ...

  6. 排序算法复习之一趟快速排序算法:为什么说关键字所占的位置是多余的

    思路: 49  38   65  97 76 13 27 先说自己的想法: 首先看38,发现38比49小,所以换位: 38 49 65  97 76 13 27 这个时候发现65,按理说应该把65放最 ...

  7. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  8. 考研DS备考|算法复习|编程or上机准备

    23考研算法复习 一.图论相关算法 1.拓扑排序 2.最小生成树 2.1 Prim算法朴素实现 2.2 最小生成树Kruskal实现 3.最短路 3.1朴素版Dijkstra 3.2Bellman-f ...

  9. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现分享

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  10. “神奇“的表插入排序算法

    文章目录 示例代码 时间复杂度: 直接插入排序算法示例如下: 具体可参考书籍: End 说真的,表插入排序算法是我学习插入排序算法中最难理解的算法之一,特意来写博客记录一下,理解思路真的不会写(或许我 ...

最新文章

  1. 请写出查询该表中成绩最大值的sql语句_SQL-汇总分析
  2. AC日记——传染病控制 洛谷 P1041
  3. 深度学习之PyTorch物体检测
  4. 用C语言解“龟兔赛跑”题
  5. 前端工程师的知识体系
  6. 两台电脑间大量数据拷贝的快捷方法
  7. linux宝塔登录不上去怎么回事,宝塔面板点击登陆没有用怎么办
  8. 01-03 Linux常用命令-文本处理
  9. BeanUtils工具类
  10. MySQL数据库设置主从同步
  11. 20172325 2018-2019-1 蓝墨云班课实验--哈夫曼树的编码
  12. 我 45 岁还写代码,怎么了?
  13. DLUTOJ #1394 Magic Questions
  14. AdventureWorks 安装和配置[转自 微软msdn]
  15. 揪出手机耗电元凶——高德地图缓存数据
  16. [转]PCB Layout中的走线策略
  17. 网页在线视频下载教程(m3u8格式介绍及下载教程)
  18. HTML5期末大作业:零食官网网站设计——美食零食官网(6页) html网页制作期末美食作业成品_小吃类网页设计期末作业
  19. 10.Java面向对象进阶2
  20. ZStack云平台云主机管理

热门文章

  1. 在线模拟解析Crontab表达式执行时间
  2. Matlab R2014a安装指南(64位win7)
  3. 2013年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版
  4. 疯狂的骗局!各地“征信修复”专项治理成效公布
  5. java 抽象类怎么输出_Java 抽象类
  6. 计算机绘图形成性考核,计算机绘图作业答案
  7. Ubuntu之apt-get系列--解决The following signatures couldn‘t be verified because the public key is not avai
  8. MIRFLICKR-1M数据集百度网盘
  9. 翻译语句为四元式序列
  10. YOLOv5进行半自动标注