数据结构与算法入门(四) | 排序
本章节主要介绍了常见的排序算法。
简单排序在我们的程序中,排序是非常常见的一种需求,提供一些数据元素,把这些数据元素按照一定的规则进行排序。比如查询一些订单,按照订单的日期进行排序;再比如查询一些商品,按照商品的价格进行排序等等。所以,接下来我们要学习一些常见的排序算法。在java的开发工具包jdk中,已经给我们提供了很多数据结构与算法的实现,比如List,Set,Map,Math等等,都是以API的方式提供,这种方式的好处在于一次编写,多处使用。我们借鉴jdk的方式,也把算法封装到某个类中,那如果是这样,在我们写java代码之前,就需要先进行API的设计,设计好之后,再对这些API进行实现。就比如我们先设计一套API如下:
类名
ArrayList
构造方法
ArrayList():创建ArrayList对象
成员方法
1、boolean add(E e):向集合钟添加元素2、E remove(int index):从集合中删除指定的元素
然后再使用java代码去实现它。以后我们讲任何数据结构与算法都是以这种方式讲解。
Comparable接口介绍由于我们这里 ...
数据结构与算法入门(三)| 算法分析
本章节主要介绍算法分析的方法,包括事前分析法(推荐)和事后分析法,然后针对事前分析法,详细介绍了大O表示法,并对于时间复杂度和空间复杂度,分别进行了实例分析。
前面我们已经介绍了,研究算法的最终目的就是如何花更少的时间,如何占用更少的内存去完成相同的需求,并且也通过案例演示了不同算法之间时间耗费和空间耗费上的差异,但我们并不能将时间占用和空间占用量化,因此,接下来我们要学习有关算法时间耗费和算法空间耗费的描述和分析。
有关算法时间耗费分析,我们称之为算法的时间复杂度分析,有关算法的空间耗费分析,我们称之为算法的空间复杂度分析。
算法的时间复杂度分析我们要计算算法时间耗费情况,首先我们得度量算法的执行时间,那么如何度量呢?
事后分析估算方法比较容易想到的方法就是我们把算法执行若干次,然后拿个计时器在旁边计时,这种事后统计的方法看上去的确不错,并且也并非要我们真的拿个计算器在旁边计算,因为计算机都提供了计时的功能。
这种统计方法主要是通过设计好的测试程序和测试数据,利用计算机计时器对不同的算法编制的程序的运行时间进行比较,从而确定算法效率的高低,但是这种方法有很大的缺陷:必须依据算法实 ...
数据结构与算法入门(二)| 数据结构和算法概述
本章节主要简要介绍了数据结构与算法的概念。
什么是数据结构?官方解释数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。
大白话数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储数据。
数据结构分类传统上,我们可以把数据结构分为逻辑结构和物理结构两大类。
逻辑结构分类逻辑结构是从具体问题中抽象出来的模型,是抽象意义上的结构,按照对象中数据元素之间的相互关系分类,也是我们后面课题中需要关注和讨论的问题。
集合结构
集合结构中数据元素除了属于同一个集合外,他们之间没有任何其他的关系。
线性结构
线性结构中的数据元素之间存在一对一的关系
树形结构
树形结构中的数据元素之间存在一对多的层次关系
图形结构
图形结构的数据元素是多对多的关系
物理结构分类逻辑结构在计算机中真正的表示方式(又称为映像)称为物理结构,也可以叫做存储结构。
常见的物理结构有顺序存储结构、链式存储结构。
顺序存储结构
把数据元素放到地址连续的存储单元里面,其数据间的逻辑关系和物理关系是一致的 ,比如我们常用的数组就是顺序存储结构。
顺序存 ...
数据结构与算法入门(一)| 课程介绍
本章节主要介绍课程内容,课程是黑马程序员出品,版权归黑马所有。
课程目标数据结构和算法这门课程无论在哪个学校的计算机专业,都是一门必修课,因为这门课程非常重要的,是编程必备的基础,但是这门课程是一门不太好学习的课程,因为它学习起来是非常的枯燥乏味的。但是如果你想让自己的编程能力有质的飞跃,不再停留于调用现成的API,而是追求更完美的实现,那么这门课程就是你的必修课,因为程序设计=数据结构+算法。通过对基础数据结构和算法的学习,能更深层次的理解程序,提升编写代码的能力,让程序的代码更优雅,性能更高。
课程内容
数据结构和算法概述
算法分析
排序
线性表
符号表
树的入门和树的进阶
堆
优先队列
并查集
图的入门和图的进阶
切换国内源大全(收集整理)
众所周知,国内的网络环境太糟糕了,所以收集整理各类服务切换国内源的方法
Ubuntu命令1234## 备份系统自带的source列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak \ && sed -i 's/^\(deb\|deb-src\) \([^ ]*\) \(.*\)/\1 http:\/\/mirrors.aliyun.com\/ubuntu \3/' /etc/apt/sources.list \ && apt-get update
国内镜像源
名称
地址
阿里镜像源
http://mirrors.aliyun.com/ubuntu
清华大学镜像源
https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
网易镜像源
https://mirrors.163.com/ubuntu/
东北大学镜像源
http://mirror.neu.edu.cn/ubuntu/
CentOS命令123456sudo ...
Kotlin从入门到精通 | 第七章 类型进阶
本章节主要介绍Kotlin类型一些不为人知的秘密
构造器构造器的基本写法1234class Person( var age: Int, // 类内全局可见 name: String // 构造器内可见(init块,属性初始化))
init块
init块可以有多个
12345678910111213class Person(var age: Int, name: String) { var name: String init { this.name = name } val firstName = name.split(" ")[0] init { // ... }}
属性必须被初始化
继承父类12abstract class Animalclass Person(var age: Int, var name: String) : Animal() // 调用父类构造器
副构造器123class Person(var ag ...
Kotlin从入门到精通 | 第六章 函数进阶
本章节主要对第四章描述的函数类型进行更进一步的描述,讲解Kotlin高阶函数、内联函数等细节。
高阶函数
参数类型包含函数类型或返回值类型为函数类型的函数为高阶函数
123456789fun needsFunction(block: () -> Unit) {}fun returnsFunction(): () -> Long { return { System.currentTimeMillis() }}
以intArray扩展函数示例
12345678// 不带返回值,参数类型为函数inline fun IntArray.forEach(action: (Int) -> Unit): Unit { for (element in this) action(element)}// 返回值类型为函数inline fun <R> IntArray.map(transform: (Int) -> R): List<R> { ret ...
Kotlin从入门到精通 | 第五章 表达式
本章节主要介绍Kotlin自带的一些表达式和简单使用
常量和变量变量Java
12int a = 2;a = 3;
Kotlin
12var a = 2a = 3
只读变量Java
1final int b = 3;
Kotlin
1val b = 3
常量Java
1static final int b = 3;
Kotlin
只能定义在全局范围
只能修饰基本类型
必须立即用字面量初始化1const val b = 3
编译期和运行时常量123const val b = 3 // 编译期即可确定常量的值,并用值替换调用处val c: Int运行时才能确定值,调用处通过引用获取值
表达式if … elseJava
Java支持三目运算符,所以可以使用以下语法
1c = a == 3 ? 4 : 5;
Kotlin
Kotlin中,if ... else ...也属于表达式,所以Kotlin开发者没有提供三目运算符,直接使用if ... else ...可以达到相同的效果
1c = if(a == 3) 4 else 5
when …Java
12345swi ...
Kotlin从入门到精通 | 第四章 类型初步
本章节主要介绍Kotlin的类型定义和简单使用
类的定义Kotlin类默认为public,类内无内容可省略
Kotlin类成员变量,方法同Java类似
Kotlin类默认带无参构造器,如果需要定义其他构造器,使用constructor关键字创建
也可以直接定义到类上
类的实例化
直观感受是,省略了new关键字,获得对象再也不需要new了
Java
123SimpleClass simpleClass = new SimpleClass(9);System.out.println(simpleClass.x);simpleClass.y();
Kotlin
123val simpleClass = SimpleClass(9)println(simpleClass.x)simpleClass.y()
接口的定义
基本和Java一致
接口的实现
implements关键字换成了:
@override注解换成了override关键字
抽象类的定义
由于Kotlin的类默认是final,所以需要添加open关键字,使之可以被继承
类的继承
extends关键字换成了:,跟接口 ...
Kotlin从入门到精通 | 第三章 Kotlin内置类型
本章节主要介绍Kotlin的内置类型和简单用法
变量的声明1val b: String = "Hello Kotlin"
Kotlin的变量声明方式,有点类似于TypeScript,是比较现代的一种做法,一般形式为修饰符 变量名: 类型 = 值,其中,类型声明可以省略。
修饰符有两种
val:只读变量
var:可读写变量,定义时必须指定值,且不可更改
与Java对比12int a = 2;final String b = "Hello Java";
12var a = 2val b = "Hello Kotlin"
易混淆的Long类型标记在Java里,Long类型结束使用l是可以编译通过,只是不推荐(小写的l,看起来就跟数字1一样)
12long c = 1234567890l; // ok but not good.long d = 1234567890L; // ok
在Kotlin里面,直接就编译不通过,强制要求修改为L
12val c = 1234567890l // compile error.val d ...