冒泡排序
算法思想:
从数列第一个元素R1开始,与邻近元素R2进行比较,若R1>R2,则交换;同理,依次比较R2R3R4R5…,经过一趟比较,最大的数被交换到数列尾端。从数列第一个元素到数列倒数第二个元素,用内层循环表示。
对除上述父数列的尾端元素的子数列重复上述操作。子数列尾端下标不断减小,用外层循环表示。
JavaScript代码实现
1
2
3
4
5
6
7
8
9
10
|
function bubbleSort(nums){
for(var end=nums.length-1; end>0;end--){
for(var i=0; i<end;i++){
if(nums[i]>nums[i+1]){
[nums[i],nums[i+1]]=[nums[i+1],nums[i]];
}
}
}
return nums;
}
|
选择排序
算法思想:
在数列第一个元素依次开始遍历,找出最大的元素,与数列尾端元素交换。遍历元素,内层循环。
对除上述父元素尾端元素的子数列,重复上述操作。尾端下表依次减小,外层循环。
JavaScript代码实现
1
2
3
4
5
6
7
8
9
10
11
12
|
function selectSort(nums){
for(var end=nums.length-1; end>0;end--){
var maxPos=0;
//这里注意要有等号 因为数列的最大值有可能本来就在尾端位置
for(var i=0;i<=end;i++){
if(nums[i]>nums[maxPos]){
maxPos=i;
}
}
[nums[maxPos],nums[end]]=[nums[end],nums[maxPos]];
}
}
|
直接插入排序
算法思想:
从最小有序子数列出发,依次将最小子数列邻近的数字插入该有序子数列中。
元素个数只有1的数列出发,若该数列邻近元素小于该数列尾端元素,则依次从尾端元素往前查找合适的插入位置并插入。从尾端元素起向前遍历,内层循环。
将该子数列长度加1,重复上述操作。尾端下标依次向后移动一位,外层循环。
JavaScript代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
function insertionSort(nums){
for(var end=1;end<nums.length;end++){
if(nums[end]<nums[end-1]){
var temp=nums[end];
var j;
for(j=end-1;j>=0 && nums[j]>temp; j--){
nums[j+1]=nums[j];
}
nums[j]=temp;
}
}
return nums;
}
|
希尔排序
希尔排序是第一个突破算法复杂度O(n2)的算法,是直接插入排序的升级版。希尔排序是将固定间隔为某interval的元素看作一组数列,对该数列进行直接插入排序。
算法思想:
JavaScript代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
function shellSort(nums){
var interval=Math.floor(nums.length/2)
for(;interval>0;interval=Math.floor(interval/2)){
for(var end=interval; end<nums.length; end++){
if(nums[end]<nums[end-interval]){
var temp=nums[end];
var j;
for(j=end-interval;j>=0&&nums[j]>temp;j-=interval){
nums[j+interval]=nums[j];
}
nums[j]=temp;
}
}
}
return nums;
}
|
快速排序
算法思想:
找一个基准数字,通过一趟排序,该基准数字的左边都比该数字小,右边都比该数字大。
2020/12/1注:
本文在迁移前,本来涉及LaTex数学公式。我尝试了很久想要使用Katex支持Latex,但是最终还是无法正确地使用$
渲染LaTex。