js数组排序

1.冒泡排序

  • 冒泡排序规则:前后两两进行比较,如果符合比较的条件,就交换两个数的位置,直到所有的数据,都符合从小到大条件,结束排序。
  • 规律:每一轮比较,都会找出一个较大的数,放在正确的位置。

代码如下:

// 冒泡排序
var bubbleSort = function(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.快速排序

快速排序的规则:

  • 随机用数组的其中一个值当基准值(中间值、中介、中线)
  • left等于0,right等于数组的长度-1,从左往右
function quickSort(arr){
        if(arr.length<1){
            return arr;
        }
        var pivotIndex=Math.floor(arr.length/2);//找到那个基准数
        var pivot=arr.splice(pivotIndex,1)[0]; //取出基准数,并去除,splice返回值为数组。
        var left=[]; 
        var right=[];
        for(var i=0;i<arr.length;i++){
            if(arr[i]<pivot){
                left.push(arr[i]);
            }else{
                right.push(arr[i]);
            }
        }
        return quickSort(left).concat([pivot],quickSort(right)); //加入基准数
    }
    arr=[2,1,5,8,3,7,4,6,9];
    console.log(quickSort(arr)); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
}

3.插入排序

插入排序的规则

  1. 把数组分成一个有序数列和一个无序数列
  2. 默认把数组第一项当成一个有序数列
  3. 拿第一项去跟其他无序项比较大小
  4. 调换位置
// 插入排序
var insertSort = function(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;
}

<think> 首先,用户正在询问JavaScript数组排序的方法。根据系统指令,我需要用中文回答,确保所有内联数学表达式使用$...$,独立公式使用$$...$$。另外,在回答中引用段落末尾添加引用标识如[^1],并生成相关问题。 参考提供的引用: - [^1] 提到JavaScript中的排序方式,包括sort排序、冒泡排序、选择排序、快速排序。 - [^2] 讨论了sort排序和选择排序,显示代码示例。 - [^3] 展示了选择排序的代码实现。 - [^4] 解释了数组的sort方法,有升序和降序的示例。 - [^5] 详细描述了sort()方法的使用,包括参数和内部机制。 用户的问题是:“我想查找JS数组排序的方法或相关知识 请问JavaScript数组排序的方法”。所以,我的回答应该覆盖JavaScript中数组排序的常见方法,特别是sort()方法,因为它是最直接的内置方法。 结构化回答: 1. **介绍主题**:简要解释JavaScript数组排序的重要性。 2. **详细讨论sort()方法**:因为它是核心,解释其语法、如何使用、默认行为(按字符编码排序),以及如何使用比较函数来自定义排序(数字排序、对象排序等)。 3. **其他排序方法**:简要提到手动实现的排序算法如冒泡排序、选择排序、快速排序,因为这些在引用中被提及。 4. **代码示例**:提供清晰的代码示例来演示各种排序方法。 5. **注意事项**:提醒用户sort()方法会改变原始数组(如引用[2]所述)。 6. **引用标识**:在相关段落末尾添加引用标识。 7. **生成相关问题**:在回答结束时添加相关问题部分。 回答结构: - 开头:介绍JavaScript数组排序。 - 主体: - sort()方法详细解释。 - 其他排序算法概述。 - 结尾:总结和建议。 - §相关问题§:列出相关问题。 确保回答真实可靠,基于引用和一般知识。 </think> ### JavaScript数组排序的方法 JavaScript提供了多种数组排序的方法,其中最常用的是内置的`sort()`方法,但也支持手动实现其他排序算法如冒泡排序、选择排序等。以下我将逐步解释这些方法,帮助您全面理解。回答基于可靠的技术文档和实践经验[^1][^2]。 #### 1. **内置`sort()`方法** `sort()`是JavaScript数组的原生方法,默认按字符串的Unicode编码排序。其语法为: ```javascript array.sort([compareFunction]) ``` - **无参数时**:默认升序排序,但会将数字转为字符串再比较。例如: ```javascript const arr = [5, 2, 1, 15]; arr.sort(); // 返回 [1, 15, 2, 5](因为'15' < '2'在Unicode中) ``` - **有比较函数时**:需提供`compareFunction(a, b)`,它返回负数、零或正数: - 返回负数:`a`应在`b`前(升序)。 - 返回正数:`a`应在`b`后(降序)。 - 返回零:顺序不变。 示例(数字升序和降序): ```javascript // 升序:返回 a - b const arr1 = [80, 40, 70]; arr1.sort((a, b) => a - b); // 返回 [40, 70, 80] // 降序:返回 b - a const arr2 = [80, 40, 70]; arr2.sort((a, b) => b - a); // 返回 [80, 70, 40] ``` 注意:`sort()`方法会**直接修改原数组**(原地排序),而不是创建新数组[^2][^4]。对于对象数组,可自定义比较函数: ```javascript const users = [{name: "Alice", age: 30}, {name: "Bob", age: 25}]; users.sort((a, b) => a.age - b.age); // 按年龄升序排序 ``` 内部机制基于比较函数返回值,类似其他语言的比较器[^5]。 #### 2. **其他手动实现的排序算法** 除了`sort()`,您可以通过循环手动实现排序算法。这些方法在特定场景(如教学或性能优化)中有用: - **冒泡排序(Bubble Sort)**: 通过多次遍历数组,比较相邻元素并交换位置。时间复杂度为 $O(n^2)$。 代码示例: ```javascript function bubbleSort(arr) { for (let i = 0; i < arr.length - 1; i++) { for (let j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; // 交换位置 } } } return arr; } const arr = [3, 57, 2, 8]; bubbleSort(arr); // 返回 [2, 3, 8, 57] ``` - **选择排序(Selection Sort)**: 每次遍历找到最小(或最大)元素,放到已排序序列末尾。时间复杂度同样为 $O(n^2)$。 代码示例(基于引用[3]): ```javascript function selectionSort(arr) { for (let i = 0; i < arr.length - 1; i++) { let minIndex = i; for (let j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]; // 交换位置 } return arr; } const arr = [3, 57, 2, 8]; selectionSort(arr); // 返回 [2, 3, 8, 57] ``` - **快速排序(Quick Sort)**: 分治算法,选择基准元素分割数组,递归排序数组。平均时间复杂度为 $O(n \log n)$。 代码示例: ```javascript function quickSort(arr) { if (arr.length <= 1) return arr; const pivot = arr[0]; const left = []; const right = []; for (let i = 1; i < arr.length; i++) { if (arr[i] < pivot) left.push(arr[i]); else right.push(arr[i]); } return [...quickSort(left), pivot, ...quickSort(right)]; } const arr = [5, 2, 1, 8]; quickSort(arr); // 返回 [1, 2, 5, 8] ``` #### 注意事项 - **默认行为问题**:`sort()`默认按字符串排序,数字排序需显式提供比较函数以避免错误[^2][^5]。 - **性能**:`sort()`在V8引擎中基于Timsort(混合排序算法),平均时间复杂度为 $O(n \log n)$,优于手动实现的 $O(n^2)$ 算法[^1]。 - **原地修改**:所有使用`sort()`的方法都会改变原数组;手动算法通常也需注意这一点[^2][^4]。 实际开发中,优先使用`sort()`加比较函数,因为它简洁高效。对于大数据集,可考虑优化算法或库如Lodash[^1][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值