【基础理论】Java常用基本排序算法简介

面试中常常会遇到手写一个算法的基本题型,以下整理下基本常用排序思想与基本算法。资料来源于互联网和部分书籍。

时间复杂度定义

算法的时间复杂度,用来度量算法的运行时间,记作: T(n) = O(f(n))。它表示随着 输入大小n 的增大,算法执行需要的时间的增长速度可以用 f(n) 来描述

通俗地说,时间复杂度是为了 估算算法需要的运行时间 的量级

时间复杂度按n越大算法越复杂来排的话:常数阶O(1)、对数阶O(logn)、线性阶O(n)、线性对数阶O(nlogn)、平方阶O(n²)、立方阶O(n³)、……k次方阶O(n的k次方)、指数阶O(2的n次方)

也就是说在实际情况中,由于指数算法的复杂性,如果不是迫不得已我们不要用复杂度为指数的算法

首先说明下几个排序算法分类关键字的含义

1、比较次数

    对于基于比较的排序算法,最好情况下的时间复杂度是O(nlogn),最坏情况下的时间复杂度是O(n^2)

2、交换次数

    排序算法以交换的次数来对算法分类

3、内存使用

    有些排序算法是“原地的”(即不占用额外的内存空间),仅需要O(1)或O(logn)的内存开销用于创建临时排序数据的辅助存储位置

4、递归

    排序算法可以是递归(如快速排序)或非递归(如选择排序和插入排序)排序,也有同时采用递归和非递归的排序算法(如归并排序)

5、稳定性

    假设A[i]=A[j],并且在原始文件中R[i]在R[j]前面。若在排序后序列中记录R[i]仍然位于R[j]前面,则称这种排序算法是稳定的。也就是说即使排序后相等元素能仍然保持它们的相对位置

6、适应性

    有少数排序算法的复杂度依赖于序列的初始排序情况(如快速排序),输入的初始排列将会影响算法的运行时间,有这种情况出现的算法称作适应算法

首先介绍常用的比较排序算法

1、冒泡排序 (键值如同“气泡”一样逐渐漂浮到序列的顶端)

    核心关键词:两两比较

    基本思想:迭代的对输入序列中的第一个元素到最后一个元素进行两两比较,当需要时交换这两个元素位置。该过程持续迭代直到在一趟排序过程中不需要交换操作为止。

    图示示例

    【基础理论】Java常用基本排序算法简介_第1张图片

    相关代码

    【基础理论】Java常用基本排序算法简介_第2张图片

【基础理论】Java常用基本排序算法简介_第3张图片

改进算法:

    【基础理论】Java常用基本排序算法简介_第4张图片

2、插入排序(原地排序)

    核心关键词:移除一个元素插入到已排序的对应位置

    基本思想:在每次迭代过程中算法随机的从输入序列中移除一个元素,并将该元素插入待排序序列的正确位置。重复该过程,直到所有输入元素都被选择一次。

    图示示例

    

    相关代码:  

3、选择排序

    核心关键词  

    基本思想

    图示示例

    相关代码:

    【基础理论】Java常用基本排序算法简介_第5张图片 

4、快速排序

5、归并排序

6、希尔排序

7、树排序

8、堆排序

你可能感兴趣的:(Java,基础)