arr.sort()默认按照Unicode编码,从小到大进行排序,会改变原数组

let arr = ["e", "b", "d", "a", "f", "c", 1, 10, 2, 12];
let result = arr.sort()arr =[1,10,12,2,"a","b","c","d","e","f"]
result =[1,10,12,2,"a","b","c","d","e","f"]

存在的致命缺陷:并没有按数字的大小进行排序,通常无法满足我们对数组的排序需求!

自定义排序规则

给sort()添加一个回调函数,根据回调函数的返回值来自定义排序规则:

  • 如果 返回值 > 0,则元素交换位置
  • 如果 返回值 < 0,则元素位置不变
  • 如果 返回值 = 0,则认为两个元素相等,不交换位置

升序排列

纯数字

let arr = [1, 10, 2, 12];
let ASCarr = arr.sort((a, b) => a - b) // 升序排列 [1,2,10,12]

字符串 + 数字

let arr = ['c', 'a', 'f', 'b', 1, 10, 2, 12];
let ASCarr = arr.sort((a, b) => {if (a > b) {return 1;} else if (a < b) {return -1;} else {return 0;}}) // ["a","b","c","f",1,2,10,12]

降序排列

纯数字

let arr = [1, 10, 2, 12];
let DESarr = arr.sort((a, b) => b - a) // 降序排列 [12,10,2,1]

字符串 + 数字

let arr = ['c', 'a', 'f', 'b', 1, 10, 2, 12];
let DESarr = arr.sort((a, b) => {if (a > b) {return -1;} else if (a < b) {return 1;} else {return 0;}
})// ["f","c","b","a",12,10,2,1]

混合排序

数组中同时存在数字、字母、汉字等

https://blog.csdn.net/weixin_41192489/article/details/116794491

十大经典排序算法

1. 冒泡排序(Bubble Sort)

数据已经正序时最快,数据是反序时最慢

function bubbleSort(arr) {var len = arr.length;for (var i = 0; i < len; 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)

时间复杂度 O(n²),在时间复杂度上表现最稳定的排序算法之一

数据规模越小越好,不占用额外的内存空间

function selectionSort(arr) {var len = arr.length;var minIndex, temp;for (var i = 0; i < len - 1; i++) {minIndex = i;for (var j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) {     //寻找最小的数minIndex = j;                 //将最小数的索引保存}}temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}return arr;
}

3. 插入排序(Insertion Sort)

function insertionSort(arr) {var len = arr.length;var preIndex, current;for (var i = 1; i < len; i++) {preIndex = i - 1;current = arr[i];while(preIndex >= 0 && arr[preIndex] > current) {arr[preIndex+1] = arr[preIndex];preIndex--;}arr[preIndex+1] = current;}return arr;
}

4. 希尔排序(Shell Sort)

希尔排序是插入排序的一种更高效率的实现。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序的核心在于间隔序列的设定。既可以提前设定好间隔序列,也可以动态的定义间隔序列。

function shellSort(arr) {var len = arr.length,temp,gap = 1;while(gap < len/3) {          //动态定义间隔序列gap =gap*3+1;}for (gap; gap > 0; gap = Math.floor(gap/3)) {for (var i = gap; i < len; i++) {temp = arr[i];for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {arr[j+gap] = arr[j];}arr[j+gap] = temp;}}return arr;
}

5. 归并排序(Merge Sort)

function mergeSort(arr) {  //采用自上而下的递归方法var len = arr.length;if(len < 2) {return arr;}var middle = Math.floor(len / 2),left = arr.slice(0, middle),right = arr.slice(middle);return merge(mergeSort(left), mergeSort(right));
}function merge(left, right)
{var result = [];while (left.length && right.length) {if (left[0] <= right[0]) {result.push(left.shift());} else {result.push(right.shift());}}while (left.length)result.push(left.shift());while (right.length)result.push(right.shift());return result;
}

6. 快速排序(Quick Sort)

处理大数据最快的排序算法之一,时间复杂度O(n²),但在大多数情况下都比平均时间复杂度为O(n log n) 的排序算法表现要更好。

function quickSort(arr, left, right) {var len = arr.length,partitionIndex,left = typeof left != 'number' ? 0 : left,right = typeof right != 'number' ? len - 1 : right;if (left < right) {partitionIndex = partition(arr, left, right);quickSort(arr, left, partitionIndex-1);quickSort(arr, partitionIndex+1, right);}return arr;
}function partition(arr, left ,right) {     //分区操作var pivot = left,                      //设定基准值(pivot)index = pivot + 1;for (var i = index; i <= right; i++) {if (arr[i] < arr[pivot]) {swap(arr, i, index);index++;}       }swap(arr, pivot, index - 1);return index-1;
}function swap(arr, i, j) {var temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}

7. 堆排序(Heap Sort)

var len;    //因为声明的多个函数都需要数据长度,所以把len设置成为全局变量function buildMaxHeap(arr) {   //建立大顶堆len = arr.length;for (var i = Math.floor(len/2); i >= 0; i--) {heapify(arr, i);}
}function heapify(arr, i) {     //堆调整var left = 2 * i + 1,right = 2 * i + 2,largest = i;if (left < len && arr[left] > arr[largest]) {largest = left;}if (right < len && arr[right] > arr[largest]) {largest = right;}if (largest != i) {swap(arr, i, largest);heapify(arr, largest);}
}function swap(arr, i, j) {var temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}function heapSort(arr) {buildMaxHeap(arr);for (var i = arr.length-1; i > 0; i--) {swap(arr, 0, i);len--;heapify(arr, 0);}return arr;
}

8. 计数排序(Counting Sort)

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。
作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

function countingSort(arr, maxValue) {var bucket = new Array(maxValue+1),sortedIndex = 0;arrLen = arr.length,bucketLen = maxValue + 1;for (var i = 0; i < arrLen; i++) {if (!bucket[arr[i]]) {bucket[arr[i]] = 0;}bucket[arr[i]]++;}for (var j = 0; j < bucketLen; j++) {while(bucket[j] > 0) {arr[sortedIndex++] = j;bucket[j]--;}}return arr;
}

9. 桶排序(Bucket Sort)

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。
为了使桶排序更加高效,我们需要做到这两点:

  1. 在额外空间充足的情况下,尽量增大桶的数量
  2. 使用的映射函数能够将输入的N个数据均匀的分配到K个桶中
  • 当输入的数据可以均匀的分配到每一个桶中时最快;
  • 当输入的数据被分配到了同一个桶中时最慢;
function bucketSort(arr, bucketSize) {if (arr.length === 0) {return arr;}var i;var minValue = arr[0];var maxValue = arr[0];for (i = 1; i < arr.length; i++) {if (arr[i] < minValue) {minValue = arr[i];                //输入数据的最小值} else if (arr[i] > maxValue) {maxValue = arr[i];                //输入数据的最大值}}//桶的初始化var DEFAULT_BUCKET_SIZE = 5;            //设置桶的默认数量为5bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;   var buckets = new Array(bucketCount);for (i = 0; i < buckets.length; i++) {buckets[i] = [];}//利用映射函数将数据分配到各个桶中for (i = 0; i < arr.length; i++) {buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);}arr.length = 0;for (i = 0; i < buckets.length; i++) {insertionSort(buckets[i]);                      //对每个桶进行排序,这里使用了插入排序for (var j = 0; j < buckets[i].length; j++) {arr.push(buckets[i][j]);                      }}return arr;
}

10. 基数排序(Radix Sort)

基数排序有两种方法:

  1. MSD 从高位开始进行排序
  2. LSD 从低位开始进行排序

基数排序 vs 计数排序 vs 桶排序

这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:

  • 基数排序:根据键值的每位数字来分配桶
  • 计数排序:每个桶只存储单一键值
  • 桶排序:每个桶存储一定范围的数值
//LSD Radix Sort
var counter = [];
function radixSort(arr, maxDigit) {var mod = 10;var dev = 1;for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {for(var j = 0; j < arr.length; j++) {var bucket = parseInt((arr[j] % mod) / dev);if(counter[bucket]==null) {counter[bucket] = [];}counter[bucket].push(arr[j]);}var pos = 0;for(var j = 0; j < counter.length; j++) {var value = null;if(counter[j]!=null) {while ((value = counter[j].shift()) != null) {arr[pos++] = value;}}}}return arr;
}

js【详解】arr.sort()数组排序(内含十大经典排序算法的js实现)相关推荐

  1. JavaScript学习总结(15)——十大经典排序算法的JS版

    前言 这世界上总存在着那么一些看似相似但有完全不同的东西,比如雷锋和雷峰塔,小平和小平头,玛丽和马里奥,Java和javascript-.当年javascript为了抱Java大腿恬不知耻的让自己变成 ...

  2. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  3. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  4. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  5. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  6. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  7. 十大经典排序算法-冒泡排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  8. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  9. 十大经典排序算法详解

    本文转自 <卢明冬的博客> 文章目录 排序算法的分析和评价 2.十大排序经典算法总览 2.1 排序算法的分类 2.2 排序算法的性能 2.3 各阶复杂度性能对比 2.4 排序算法的初始状态 ...

最新文章

  1. LeetCode Longest Substring Without Repeating Characters
  2. electron打包现成的vue项目成.exe文件,build打包vue项目(quasar 框架)
  3. 源码编译依赖关系一例小结
  4. python里自带的绘画库是_Python绘图Turtle库详解
  5. python基础入门(9)之字典
  6. Java流程控制03 循环结构 While循环 DoWhile循环 For循环 增强型For循环
  7. linux驱动之可加载模块
  8. 如何在一行 rm -rf 的基础上释放 Mac 上的内存空间?
  9. python工业互联网应用实战13—基于selenium的功能测试
  10. Spring Cloud Feign 1(声明式服务调用Feign 简介)
  11. 微服务化的基石--持续集成
  12. 分享一下自己收集到的真实用户的UA
  13. 乱谈SOA——IT世界观及方法论
  14. 雅利安人有多强悍?灭掉三个文明古国,为何败在殷商的脚下
  15. 在线教育项目【老师服务】
  16. 推荐一个可以做历年蓝桥杯真题的网站
  17. DS18B20 Proteus
  18. Prim 算法的实现
  19. 软件工程第一次结对作业
  20. 组一个包括协调器路由器终端节点的zigbee网络,通过串口能获取它们的拓扑结构。

热门文章

  1. 读懂 Android 中的代码混淆
  2. android+apk+不被杀毒软件,大多数APK应用都会被杀毒软件报毒吗?
  3. 在Pycharm中输入中文显示为繁体的解决办法
  4. 深信服C++ 一面(技术面、70min、offer)
  5. 项目实战:简易俄罗斯方块(附源码)
  6. Ajax vs Willem II,Ajax is bedrijfsongeval weer te boven
  7. 中国AI方法影响越来越大,天大等从大量文献中挖掘AI发展规律
  8. Mysql安装后打开MySQL Command Line Client闪退处理办法,亲测有效
  9. 如何用迅雷下载OneDrive文件
  10. 十款在线图表制作服务