排序算法

91 阅读4分钟

算法入门-排序算法

之前学习了js的相关语法,函数,数组,原型等,现在来学习程序员都要修炼的内功,算法与数据结构

什么是算法?

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

算法就是解决问题的一些策略

什么是数据结构?

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

其实数据结构就是数据与数据之间的关系

先从最简单的例子入手

表示两个数据

  • 如果顺序有意义

    [x,y]表示第一个是x,第二个是y 那么我们就要提供first和last操作

  • 如果顺序没有意义

    (x,y)和(y,x)一样 就不需要提供first和last操作

数据结构的作用

  1. 提前记住一些结构

这些结构能让你快速理清思路

   2.锻炼抽象能力

一种数据结构往往能解决很多类似的问题

如果选错了数据结构,根本就想不出思路

如何快速了解数据结构和算法呢,我打算从排序算法入手

打算了解的几种排序算法

  1. 冒泡排序
  2. 选择排序
  3. 快速排序
  4. 归并排序
  5. 插入排序
  6. 计数排序

排序算法

冒泡排序

原理:

比较所有的相邻元素,如果第一个比第二个大,就交换它们

一轮下来,可以保证最后一个数是最大的

执行n-1轮,就可以完成排序

代码实现:

让冒泡的算法挂到数组的原型上,这样我们可以直接像调用js原生的sort方法一样去调用

时间复杂度O(n^2)

使用的数据结构:数组

选择排序:

选择排序思路:

找到数组中的最小值,选中它并将其放置到第一位

接着找到第二小的值,选中它放在第二位

递归实现方法

首先我们实现用递归找出数组中的最小值

然后实现一个通过数组最小值找到数组最小值下标的方法

实现选择排序

循环实现方法:

时间复杂度O(n^2)

快速排序

思路:以某某为基准

想象你是一个体育委员,你面对的同学为【12,3,4,6,1,35,55】

以某某为基准,小的去前面,大的去后面

只要重复这句话,就能排序了

递归的时间复杂度为O(logN)

分区的时间复杂度为O(n)

所以时间复杂度为O(N*logN)

用到的数据结构:还是数组

思路:

不以某某为基准了

你现在面对的同学跟刚才一样是【12,3,4,6,1,35,55】

现在你让他们 左边一半排好序  右边一般排好序

然后左右合并起来

具体思路用图可以这样说明

mergeSort中其实就是用递归不断的吧数组分成两个部分

merge中对两个部分中的第一个进行比较,小的放到前面去,然后再递归

算法时间复杂度O(n*logn)

插入排序

思路:

从第二个数开始往前比

比它大就往后排

以此类推到最后一个数

插入排序的时间复杂度O(n^2)

计数排序

思路:

用一个哈希表来做记录

发现数组N就记 N:1 如果再次发现N就加1

最后把哈希表的key全部打出来,假设N:m 那么N需要打印m次

在js中 有一个数据结构可以很好的实现哈希表,字典 Map

实现方法:

可以很清楚的看到控制台打印的map中的结构

计数排序特点:

使用了数据结构hash表

只遍历了数组一遍  不过还要再遍历一次hash表

时间复杂度:O(n+max)