排序算法
之前写过的脚本语言全都忘了,这里打算利用排序算法复习一下。。。。
冒泡排序
优化点:
- 每趟排序会使一个数字到达到达它的最终位置,所以每趟冒泡的次数最大是
length-1-i
; - 在一趟冒泡中如果没有发生位置交换,则认为已经是有序队列,不再进行冒泡;
Java版本:
1 | public class Main { |
javaScript:
1 | let numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
c++:
1 |
|
python:
1 | numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
TypeScript(啊,好像和js一样,改一下解构赋值凑个数…):
1 | let numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
选择排序
每一趟选出一个最小(最大)的放到最终位置。
Java:
1 | public class Main { |
JavaScript:
1 | let numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
Python:
1 | numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
C++:
1 |
|
插入排序
Java
1 | public class Main { |
JavaScript:
1 | let numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
python:
1 | numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
C++
1 |
|
快速排序
快速排序需要注意的是,不要太过于看重左右节点交换的过程,每一趟排序只是为了分成左右两个子段。比如可以不用左右交换,直接从头到尾遍历,遇到比key小的值就放到key的左边,这样子也可以得到结果
Java:
1 | public class Main { |
JavaScript:
1 | let numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
Python:
1 | numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
C++:
1 |
|
希尔排序
Java:
1 |
JavaScript:
1 |
Python
1 |
C++:
1 |
归并排序
Java:
1 | public class Main { |
JavaScript:
1 | let numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
Python
1 | numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
C++:
1 |
|
堆排序
堆分为大根堆和小根堆。
堆排序则是分为几个步骤:
建堆
建堆有两种方式,一种是对数据从0开始执行插入操作,每次插入后调整。
一种是直接从 len/2 处向0处开始调整,大多数排序都是以这种方式建堆。
交换根节点和最末节点,然后对len-1的数据重新建堆,用大根堆的时候根节点最大,此时此最大值会在最末节点位置处。
重复第二步,直到建堆的数据数量等于1。
Java:
1 | public class Main { |
JavaScript:
1 | let numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75]; |
Python
1 | numbers = [82,37,10,69,1,92,6,13,77,33,47,12,23,82,71,57,58,51,57,75] |
C++:
1 |
|
写的时候发现好多基本的语法都全忘光了。。
c++的交换,发现用异或来交换可能会导致问题,
比如我想象的过程是
1 |
|
结果实际执行的是
1 |
|
另外js和python的版本基本都是直接复制的java的逻辑,没有用上它们特色的函数式编程等方式,比如js版本的快排,虽然它要了更多空间,但是js的那种实现明显更‘地道’.