写在前边 大家好,我是melo,一名大二上软件工程在读生,经历了一年的摸滚,现在已经在工作室里边准备开发后台项目啦. 不过这篇文章呢,还是想跟大家聊一聊数据结构与算法,学校也是大二上才开设了数据结构这门课,希望可以一边学习数据结构一边积累后台项目开发经验. 最近我们进入了排序算法专题,上节课聊到了"简单"插入排序,那在简单的基础上,我们可以怎么做进一步的优化呢,这篇来看看优化版--希尔排序! 知识点 概念 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进…
总算进入我们的排序相关算法的学习了.相信不管是系统学习过的还是没有系统学习过算法的朋友都会听说过许多非常出名的排序算法,当然,我们今天入门的内容并不是直接先从最常见的那个算法说起,而是按照一定的规则一个一个的介绍. 首先,我们要介绍的排序算法是插入类型的排序算法.顾名思义,插入排序就是将无序的一个或几个记录"插入"到有序的序列中,比较典型的例子就是简单插入排序和希尔排序. 简单插入排序 简单插入排序,也可以叫做直接插入排序.还是先看代码,再来进行下一步的解释. function Ins…
项目中越来越多的用到Fragment,在用Fragment取代TabHost的时候遇到了一个问题,我们都知道,TabHost的Tab为Activity实例,有OnKey事件,但是Fragment中没有,但是又必须监听OnKey事件怎么办(不仅仅是退出哦),如果仅仅是退出我们可以在Activity中进行统一处理. 下面记录一下在ActionBar中监听Fragment的onKey事件. ActionBar实现Onkey事件,判断当前的fragment是哪一个,是不是所需要的Fragment,然后在…
$arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序法  *     思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来.  *     比如:2,4,1    // 第一次 冒出的泡是4  *                2,1,4   // 第二次 冒出的泡是 2  *                1,2,4   // 最后就变成这样 $arr=array(1,43,54,62,21,66,32,78,36,76,39); fu…
希尔排序思想:使数组中随意间隔为h的元素都是有序的. 希尔排序是插入排序的优化.先对数组局部进行排序,最后再使用插入排序将部分有序的数组排序. 代码例如以下: /** * * @author seabear * */ public class ShellSort { public static void sort(Comparable[] a) { int N = a.length; int h = 1; while(h < N/2) { h = 4 * h + 1; } while(h >=…
希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机学会月刊发布了一个排序算法,从此名为希尔排序的算法诞生了. 注:ACM = Association for Computing Machinery,国际计算机学会,世界性的计算机从业员专业组织,创立于1947年,是世界上第一个科学性及教育性计算机学会. 希尔排序是直接插入排序的改进版本.因为直接插入…
这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一些,再来学习两个非常简单的排序算法. 简单选择排序 首先是简单选择排序,它划分在了选择类排序下面,不过其实也可以看成是交换类的排序.因为它的核心代码中也是有交换操作的实现的.关于这个排序没有什么太多好说的,每次在遍历中找出最大或者最小的数据,然后将它放到相应的位置就可以了.我们先来看代码,然后再看图…
简单插入排序 适用于记录较少且基本有序的记录.算法思想:给定一个存在分界线的序列,分界线左边有序,右边无序,依次将右边的没排序的数与左边序列进行比较,插入相应位置,再对分界线做出相应调整,下面用图来说明. 代码如下: 时间复杂度:最好情况O(n),最坏O(n^2). 希尔排序 希尔排序是改进后的简单插入排序.算法思想:将序列分组排序,最后在进行一次简单插入排序. 至于如何分组,下面我将用图向大家展示 这些数的下标从0开始,即0,3 ,6,9为一组,1,4,7为一组,2,5,8为一组.也就是gap…
今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内部排序算法: 类别 名称 时间复杂度(默认最坏情况) 空间复杂度 稳定性 备注 插入排序 直接插入排序  O(n^2)  O(1) 稳定   插入排序 希尔排序  最坏O(n^2),平均O(n^1.3)  O(1) 不稳定    交换排序 冒泡排序  O(n^2)  O(1) 稳定    交换排序…
目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列表的时间也不尽相同.今天,我就准备了八种排序的python代码,并且准备测试一下他们计算的时间 基数排序 基数排序的基本思想是先将数字按照个位数上数字的大小进行排序,排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序,依次推类 # 统计这个列表中数字最大的数字有几位 def radix_s…