十大经典排序算法(动图演示)
[算法总结] 十大排序算法 https://zhuanlan.zhihu.com/p/42586566
https://zhuanlan.zhihu.com/p/172524701
要点:
算法与数据结构,密切相关。不同的数据结构,可能最适合采用相应的不同算法。
-------
参考:
十大经典排序算法(动图演示)
https://blog.csdn.net/ken2232/article/details/135198491
经典查找算法(动图演示)
https://blog.csdn.net/ken2232/article/details/135198933
可视化算法网站汇总,从此简单学算法!(附动图)
https://blog.csdn.net/ken2232/article/details/135198827
==================================
十大经典排序算法(动图演示)
https://www.cnblogs.com/onepixel/articles/7674659.html
0、算法概述
0.1 算法分类
十种常见排序算法可以分为两大类:
- 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
- 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

0.2 算法复杂度

0.3 相关概念
- 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
- 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
- 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
- 空间复杂度:是指算法在计算机
内执行时所需存储空间的度量,它也是数据规模n的函数。
1、冒泡排序(Bubble Sort)(重新定义为:沉底排序)
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
为什么要废弃“冒泡排序”这个概念,而重新定义为:沉底排序?
a. 概念定义不形象,导致在学习和理解上的困难
“因为越小的元素会经由交换慢慢“浮”到数列的顶端”:>> 多慢?
说明:这种解释,似乎不形象?重新定义为:沉底排序:”最重最先沉,越重越先沉,越重沉得越底;可相邻交换”。
最重==最大数;沉==>> 沉向数组的底部(下图的右侧),底部==数组最大的下标编号位置。
b. 将最小数最先移动到最左侧(数组最小的下标编号位置),可以吗?这样“冒泡”就形象了。
但是,如此一来,势必要将 for (var i = 0; i < len - 1; i++) {} 修改为: for (var i = len - 1; i > 0; i--) {}
而大多数的编程思维习惯,总是从 0开始;这种做法违反了人们的编程思维习惯,因此,并不好?
c. 两种定义方法的比较
沉底排序:内层 for 循环每轮运行结束,就有一个当时(当前)最大的数被沉底;已经被沉底的那些当时的最大数,不再参与之后内层 for循环的“沉底”运算。外层 for 循环主要是控制着内层 for 循环的计算范围和运算轮数;外层 for 循环运行结束,排序就完成了。
”越大的数:沉底越优先,沉得越底;可相邻交换“,只要一句话,就可以将这种排序的原理描述清楚了,一目了然。
原理简要::最大的数首先被沉到最底,以此类推;沉底的顺序:从最重(最大数)到最轻(最小数),依次进行;可相邻交换。
内层 for循环负责将当时(当前)的最大数进行“沉底”操作;外层 for循环负责控制内层 for循环沉底操作的循环范围和轮数。
冒泡排序:最小的数(最小的泡泡),不能一目了然地知道要循环多少次,才能够冒泡到数组下标为 0 的位置?
个人认为:将这种排序方法,命名为:沉底排序;相比较于命名为“冒泡排序”,会更加容易并方便人们的学习和理解,是这样吗?
与“选择排序”的主要区别:在战术实现方法上
- 在战略思想上,按照最大数在底端的选择排序,与沉底排序,它们是一样的。
- 在战术实现方法上,沉底排序,交换可发生在相邻的两个数之间;而按照最大数在底端的选择排序,交换直接发生在:最大数与最大存放位置,次大数与次大存放位置之间,以此类推。
>> 沉底排序,采用的是将当前的最大数,通过不断“中转(可相邻交换)”的方法去罗马;而按照最大数在底端的选择排序,采用的是将当前的最大数,直达罗马。 - 因此,“沉底排序”可以更直观、准确地表示为:可相邻交换沉底排序。
所谓“可相邻交换”:在当前有效运算范围内的数据,只要相邻的两个数不相等时,就会发生交换。 - 选择排序:也可以重新定义为:“直达排序”。
概念的准确性,很重要:
“冒泡排序”在 N多年之前,我就学习了,但是,却总是记不住,因为它不形象,因而不容易记忆。学习、使用、以及XX 的个人与社会成本,都很高啊!!
这类模模糊糊、糊里糊涂的概念,在现实生活中,实在是太多了。因此,对于宇宙中的一切,人们应该学会自己来对概念进行定义、标识和释义的能力;科学的发明与创造,来源于此,财富的新增长点,也来源于此;而不是:在概念级别上的人云亦云。
1.1 算法描述
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
1.2 动图演示

1.3 代码实现
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len - 1; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { // 相邻元素两两对比
var temp = arr[j+1]; // 元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
2、选择排序(Selection Sort)
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
2.1 算法描述
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:
- 初始状态:无序区为R[1..n],有序区为空;
- 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
- n-1趟结束,数组有序化了。

本文介绍十大经典排序算法,包括冒泡(沉底)、选择、插入等排序。阐述算法分类、复杂度等概念,给出各算法描述、动图演示及代码实现,并进行算法分析,如时间和空间复杂度等,还探讨了冒泡排序重新定义为沉底排序的原因。
(***)&spm=1001.2101.3001.5002&articleId=135198491&d=1&t=3&u=f386cf687b3d42b786c28f32b8ba76fe)
1万+

被折叠的 条评论
为什么被折叠?



