javascript中用数组sort排序问题

本文探讨了JavaScript中sort函数的工作原理,特别是它如何直接修改原始数组而不创建副本的特点。通过示例代码展示了不同调用方式的影响。

对于javascript中sort函数之前只是简单使用,并没有详细的追究其原理,今天写了一段简单的代码,结果就发现问题了。。。

<script type="text/javascript">
        var years = new Array(1993,1999,1989,2001,2010);
        var sortYeays=years.sort();
        document.write("排序前:"+years);
         document.write("排序后:"+sortYeays);
</script>
执行结果如下:
排序前:1989,1993,1999,2001,2010排序后:1989,1993,1999,2001,2010
到这里可能你也会发现问题,排序前应该是:1993,1999,1989,2001,2010。但结果却是排序后的结果。。委屈
查阅资料后发现在javascript中sort函数是对数组的引用排序,不会产生副本。知道这个原因就不难解释上面的现象了,上面的代码执行
var sortYeays=years.sort();后,对years数组的引用进行了排序,这样在存储空间中years保存的值就是排序之后的结果。后面再调用years数组,就是用的新的结果值。而不是在存储空间中开辟一块years数组的副本(用来保存sort后的结果值)。所以就会造成上面的执行结果,但下面的代码就会得到我们想要的结果
<script type="text/javascript">
        var years = new Array(1993,1999,1989,2001,2010);
        document.write("排序前:" + years);
         document.write("排序后:"+years.sort());
 </script>
执行结果如下:
排序前:1993,1999,1989,2001,2010排序后:1989,1993,1999,2001,2010
啰嗦了半天,总之在javascript中的sort函数是在原数组上进行排序,不生成副本。。。。



 


 

<think>好的,用户之前问过如何生成一个创建元素后自动排序的代码,当时我给的Java示例是关于生成随机字符串并按长度排序的。现在用户的新问题是“创建一个数组然后自动排序的代码”,看起来是类似的需求,但可能更基础,或者用户希望用数组而不是集合。 首先,我需要确定用户的使用场景。可能用户刚开始学习编程,或者需要处理数组而不是动态集合。之前的回答用了ArrayList和Comparator,但这次用户明确提到数组,可能需要用基本的数组结构和排序方法。 接下来,用户的需求可能不仅仅是排序,还包括如何创建数组。例如,是否需要用户输入元素,还是自动生成?之前的例子是生成随机元素,但这次可能需要手动输入或者简单初始化。 然后,用户可能的真实需求是理解数组的创建和排序的基本步骤,特别是使用Java语言。考虑到Java中对数组排序可以使用Arrays.sort(),这可能是一个关键点。需要确保代码示例正确,语法正确,并且有详细注释。 另外,用户可能对基本类型和对象数组排序有疑问。比如,int数组和String数组排序方式是否不同。需要分别举例说明,因为基本类型和对象的排序在Java中处理方式不同,但都使用Arrays.sort()。 还要考虑是否需要解释排序算法,但用户可能只需要知道如何使用现有的库方法,而不是自己实现排序。因此,重点应放在如何使用Arrays.sort(),以及可能的自定义排序方法,比如逆序或者自定义比较器。 可能需要检查之前的回答是否有可以复用的部分,但这次要使用数组而不是List。例如,在之前的回答中用了ArrayList和Comparator,现在换成数组和Arrays.sort()。 此外,用户可能希望代码示例尽可能简单,特别是如果是初学者的话。因此,分成不同的示例,如基本类型排序、字符串排序、降序排序等,可以帮助用户逐步理解。 还需要注意用户是否可能混淆数组和集合的区别,所以在回答中可以简要说明两者的不同,以及为什么在这里使用数组。例如,数组是固定长度,而集合是动态的,但用户明确要求数组,所以必须用数组实现。 最后,确保代码示例正确,比如导入必要的类(如java.util.Arrays),处理输入(如果用户需要输入元素),以及输出结果。例如,手动初始化的数组可能更简单,而动态输入可能需要循环和Scanner类。 总结步骤: 1. 创建数组的几种方式:静态初始化、动态输入。 2. 使用Arrays.sort()进行排序。 3. 展示不同类型数组排序(int、String)。 4. 提供自定义排序的例子,如降序。 5. 确保代码示例简洁,有注释,运行示例和说明。</think>以下是基于 **Java 数组** 的自动排序实现代码,包含 **基础版** 和 **进阶版** 两种实现方式,并附详细注释说明: --- ### 基础版:手动初始化数组 + 自动排序 ```java import java.util.Arrays; public class ArrayAutoSorter { public static void main(String[] args) { // 1. 手动初始化数组 int[] numbers = {9, 4, 15, 2, 7}; // 2. 自动排序(升序) Arrays.sort(numbers); // 3. 输出结果 System.out.println("排序数组: " + Arrays.toString(numbers)); } } ``` --- ### 进阶版:动态输入数组 + 自动排序 ```java import java.util.Arrays; import java.util.Scanner; public class DynamicArraySorter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 1. 输入数组长度 System.out.print("请输入数组长度: "); int length = scanner.nextInt(); // 2. 动态创建数组 int[] array = new int[length]; // 3. 输入数组元素 System.out.println("请输入" + length + "个整数:"); for (int i = 0; i < length; i++) { array[i] = scanner.nextInt(); } // 4. 自动排序(升序) Arrays.sort(array); // 5. 输出结果 System.out.println("排序数组: " + Arrays.toString(array)); } } ``` --- ### 运行示例: ``` // 基础版输出 排序数组: [2, 4, 7, 9, 15] // 进阶版交互 请输入数组长度: 3 请输入3个整数: 15 -2 8 排序数组: [-2, 8, 15] ``` --- ### 扩展功能说明: #### 1. 字符串数组排序 ```java String[] fruits = {"Apple", "Banana", "Cherry", "Mango"}; Arrays.sort(fruits); // 按字母顺序排序 System.out.println(Arrays.toString(fruits)); // 输出: [Apple, Banana, Cherry, Mango] ``` #### 2. 降序排序技巧 ```java Integer[] numbers = {5, 1, 9, 3}; // 必须用包装类 Arrays.sort(numbers, Collections.reverseOrder()); System.out.println(Arrays.toString(numbers)); // 输出: [9, 5, 3, 1] ``` #### 3. 自定义排序规则(例如按字符串长度) ```java String[] words = {"Java", "Python", "C", "JavaScript"}; Arrays.sort(words, (a, b) -> a.length() - b.length()); System.out.println(Arrays.toString(words)); // 输出: [C, Java, Python, JavaScript] ``` --- ### 核心原理说明: 1. **`Arrays.sort()` 方法** - 对基本类型数组(如 `int[]`)使用 **双轴快速排序**(Dual-Pivot Quicksort) - 对对象数组(如 `String[]`)使用 **归并排序**(Timsort) 2. **时间复杂度对比** | 数据类型 | 时间复杂度 | |---------------|------------------| | 基本类型数组 | $O(n \log n)$ | | 对象数组 | $O(n \log n)$ | --- 如果需要其他语言(如Python/JavaScript)的实现示例,可以告诉我具体需求!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值