常见的排序算法

上海分院:刘泽华

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

算法的特点

1.有限性(Finiteness):一个算法必须保证执行有限步之后结束。

2.确切性(Definiteness): 一个算法的每一步骤必须有确切的定义。

3.输入(Input):一个算法有零个或多个输入,以刻画运算对象的初始情况,所谓零个输入是指算法本身给定了初始条件。

4.输出(Output):一个算法有一个或多个输出。没有输出的算法毫无意义。

5.可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。

常见的几种算法

洗牌算法、快速排序、冒泡算法、选择排序、插入排序、希尔排序、归并排序

2.知识剖析

快速排序

思想: 快速排序思想:先找到一个基准点(一般指数组的中部),然后数组被该基准点分为两部分,依次与该基准点数据比较,如果比它小,放左边;反之,放右边。 左右分别用一个空数组去存储比较后的数据。最后递归执行上述操作,直到数组长度 小于等于1。

特点: 快速,常用。缺点是需要另外声明两个数组,浪费了内存空间资源。

冒泡排序

思想: 冒泡排序思想:每一次对比相邻两个数据的大小,小的排在前面,如果前面的数据比后面的大就交换这两个数的位置。 这样一来,第一轮就可以选出一个最小的数放在最后面;那么经过n-1轮,就完成了所有数的排序。

要实现上述规则需要用到两层for循环,外层从第一个数到倒数第二个数,内层从外层的后面一个数到最后一个数。

经典洗牌算法

3.常见问题

Array.prototype.sort 方法被许多 JavaScript 程序员误用来随机排列数组。

以下就是常见的完全错误的随机排列算法: function shuffle(arr){ return arr.sort(function(){ return Math.random() - 0.5; }); }

4.解决方案

5.编码实战

6.扩展思考

怎么理解各种排序算法的时间复杂度和空间复杂度?

算法优劣评价术语 稳定性: 稳定:如果 a 原本在 b 前面,而 a = b,排序之后 a 仍然在 b 的前面;

不稳定:如果 a 原本在 b 的前面,而 a = b,排序之后 a 可能会出现在 b 的后面;

排序方式: 内排序:所有排序操作都在内存中完成,占用常数内存,不占用额外内存。 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行,占用额外内存。

7.参考文献

js实现两种实用的排序算法——冒泡、快速排序

8.更多讨论

鸣谢

感谢观看

BY——刘泽华