sort()
sort((a,b)=>a-b)大于0 升序,sort((a,b)=>b-a)小于0 降序
// 特别的
var ar1=[2,4,6,8,1,3]
var ar2=[2,16,36,8,56]
ar1.sort()
ar2.sort()//这个方法值只能排序第一位数 也可以字符串进行排序
console.log(ar1)//[1,2,3,4,6,8]
console.log(ar2)//[16, 2, 36, 56, 8]; //把数组里面当成字符串处理
默认排序顺序是升序,将元素转换为字符串,然后比较其UTF-16代码单元值的序列
第一种为js原生,以下开始排序算法:
冒泡排序
每轮依次比较相邻两个数的大小,后面比前面小则交换
//冒泡 升序
// - 思想:依次两两比较,如果后面小则交换位置
let arr = [4,2,8,4,11,4,0];
let temp = 0, isChange = 0; //用于交换 和 是否发生置换
for(let i=0; i<arr.length-1;i++){ //外层循环控制排序的趟数
isChange = 0; //优化,每比较一趟就重新初始化为0
for(let j=0; j<arr.length-i-1; j++){ //一轮下来,保证最后一个最大;
//j要从0不是i,因为第一位不是最小; 且长度每轮减一 进行优化
if(arr[j] > arr[j+1]){ //两两比较,若前面大,则交换
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
isChange = 1; //优化,如果进到这里面了,说明发生置换了
}
}
if (isChange === 0) { //优化,如果比较完一趟没有发生置换,那么说明已经排好序了,不需要再执行下去了
break;
}
}
console.log(arr);
选择排序
依次找到剩余元素的最小值或者最大值,放置在末尾或者开头。
注意 :选择排序是时间复杂度上表现最稳定的算法之一,因为最快、最慢时间复杂度都是O(n²),用选择排序数据量越小越好。
插入排序
以第一个元素为有序数组,其后的元素通过再这个已有序的数组中找到合适的元素并插入。
希尔排序
通过某个增量 gap,将整个序列分给若干组,从后往前进行组内成员的比较和交换,随后逐步缩小增量至 1。希尔排序类似于插入排序,只是一开始向前移动的步数从 1 变成了 gap。
let arr = [4,2,8,4,11,4,0];
let len = arr.length;
// 初始步数,为中间数
let gap = parseInt(len / 2);
// 逐渐缩小步数
while (gap) {
// 从第gap个元素开始遍历
for (let i = gap; i < len; i++) {
// 逐步其和前面其他的组成员进行比较和交换
for (let j = i - gap; j >= 0; j -= gap) {
if (arr[j] > arr[j + gap]) {
[arr[j], arr[j + gap]] = [arr[j + gap], arr[j]]; //两两交换
} else {
break;
}
}
}
gap = parseInt(gap / 2);
}
console.log(arr);
归并排序
递归将数组分为两个序列,有序合并这两个序列。作为一种典型的分治思想的算法应用,归并排序的实现由两种方法:
- 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法)。
- 自下而上的迭代。
堆排序
说到堆排序,首先需要了解一种数据结构——堆。堆是一种完全二叉树,这种结构通常可以用数组表示。在实际应用中,堆又可以分为最小堆和最大堆,两者的区别如下:
- -max-heap property :对于所有除了根节点(root)的节点 i,A[Parent(i)]≥A[i]
- -min-heap property :对于所有除了根节点(root)的节点 i,A[Parent(i)]≤A[i]
堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
- 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列
- 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列
计数排序
以数组元素值为键,出现次数为值存进一个临时数组,最后再遍历这个临时数组还原回原数组。因为 JavaScript 的数组下标是以字符串形式存储的,所以计数排序可以用来排列负数,但不可以排列小数。
桶排序
取 n 个桶,根据数组的最大值和最小值确认每个桶存放的数的区间,将数组元素插入到相应的桶里,最后再合并各个桶。
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。
基数排序
使用十个桶 0-9,把每个数从低位到高位根据位数放到相应的桶里,以此循环最大值的位数次。但只能排列正整数,因为遇到负号和小数点无法进行比较。
参考:
https://juejin.cn/post/6844904039566540808
https://juejin.cn/post/6844903583301763085