关于数组(笔记,更新ing)

本文深入讲解了冒泡排序、选择排序、插入排序及快速排序的实现原理与代码示例,探讨了排序算法的优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序

1.冒泡排序
    let arr = [1,3,4,2,7,5,6,8]
    function bubleSort(arr) {
    var len = arr.length;
    for (let outer = len ; outer >= 2; outer--) {
        for(let inner = 0; inner <=outer - 1; inner++) {
        	console.log("outer:"+outer)
        	console.log("inner:"+inner)
            if(arr[inner] > arr[inner + 1]) {
                [arr[inner+1],arr[inner]] = [arr[inner],arr[inner+1]]
            }
        }
    }
    return arr;
}
bubleSort(arr)
console.log(arr)
复制代码

关于冒泡排序有个细节就是,即使是数组已经完成排序,循环也不会停止。 打印出来的outerinner如图所示:

所以可以做出优化如下:

    let arr = [1,3,4,2,7,5,6,8]
    function bubleSort(arr) {
    var len = arr.length;
    for (let outer = len ; outer >= 2; outer--) {
    	let completeSort = true
        for(let inner = 0; inner <=outer - 1; inner++) {
        	console.log("outer:"+outer)
        	console.log("inner:"+inner)
            if(arr[inner] > arr[inner + 1]) {
                [arr[inner+1],arr[inner]] = [arr[inner],arr[inner+1]]
                completeSort = false
            }
        }
        if(completeSort){
        	break
        }
    }
    return arr;
}
bubleSort(arr)
console.log(arr)//[1,2,3,4,5,6,7,8]
复制代码

我们依然打印出outerinner

我们会发现,其实再最完成循环到outer=6之时,数组已经完成了排序。

2.选择排序
let arr = [1,3,4,2,7,5,6,8]
function selectSort(arr) {
    var len = arr.length;
    for(let pos = 0 ;pos < len - 1; pos++) {
        for(let cur = pos ; cur<len; cur++) {
            if(arr[cur] < arr[pos]) {
                [arr[cur],arr[pos]] = [arr[pos],arr[cur]];
            }
        }
    }
    return arr
}
selectSort(arr)
console.log(arr)
复制代码

选择排序实现思路就是依次将数组的每一项元素都与所有其他元素比较大小,而后依照排列规则调换位置。

3.插入排序
let arr = [1,3,4,2,7,5,6,8]
function insertSort(arr) {
    for(let i = 1; i < arr.length; i++) {  
        for(let j = i; j > 0; j--) { 
            if(arr[j] < arr[j-1]) {
                [arr[j],arr[j-1]] = [arr[j-1],arr[j]];
                console.log(arr)
            } else {
                break;
            }
        }
    }
    return arr;
}
insertSort(arr)
复制代码

插入排序就是默认arr[0]这一段是有序的(只有一个元素当然是有序的咯),然后往这个有序片段里面插入元素,插入的方法是将无序片段(也就是首项之后的所有元素的片段)的每一项与有序片段里的每一段对比,按照规则将无序片段中的元素插入到有序片段中,从始至终保证有序片段的“纯净”。因为是与有序片段对比,所以如果与有序末尾的最后一个元素对比结果是不进入if的话,那后面也没需要对比,可以直接break了,这是需要注意的地方。

*快速排序
function quickSort(arr) {
	debugger
    if(arr.length <= 1) {
        return arr //递归出口
    }
    var left = [],
        right = [],
        current = arr.splice(0,1); //注意splice后,数组长度少了一个
    for(let i = 0; i < arr.length; i++) {
        if(arr[i] < current) {
            left.push(arr[i])  //放在左边
        } else {
            right.push(arr[i]) //放在右边
        }
    }  
    return quickSort(left).concat(current,quickSort(right)); //递归
}
复制代码

如代码所示,快速排序就是将每个元素与一个基准元素比较大小,然后按照规则判断这个元素是放在这个基准的左边还是右边,重复执行就可以得到一个有序的数组了。比如说一群人按身高来列队,我们将没有列好的队伍中选出一个人出列,作为基准,然后让所有身高比他高的站他右边,比他矮的站他左边。但是这样只操作一次肯定是得不到一个整齐的队伍的,所以我们还要对基准左右两边的人再进行这个操作。

至于为什么是current = arr.splice(0,1),是因为当最后left或者right中只剩余2个元素的时候,这两个元素间依然是要排序的,所以为了保证取到current,就必须是splice(0,1)或者splice(1,1),是不可随机选择的。

转载于:https://juejin.im/post/5cc185c46fb9a0323070d629

<think>好的,我现在需要处理用户关于Java数组学习资料的查询。首先,用户提供的引用内容里有很多关于Java数组笔记,包括初始化、遍历、常见算法等。我需要整合这些信息,确保回答结构清晰,符合用户的要求。 首先,用户希望得到结构化的回答,所以我应该分章节或部分来组织内容。根据引用[4],数组的初始化和访问是基础,需要详细说明动态和静态初始化的区别,以及默认值的情况。然后,引用[1]和[2]提到了遍历和内存分配,这部分可以单独作为一节,解释循环遍历的方法。接下来,引用[3]中的常见算法,比如翻转、冒泡排序和二分查找,需要具体说明实现步骤,可能的话提供代码示例,但用户之前的问题中有Python示例,这里可能需要Java代码,但根据引用内容中的代码片段,可以适当调整。 用户要求使用中文回答,并且数学表达式用$...$,独立公式用$$...$$。不过Java数组的内容可能涉及较少的数学公式,但如果有涉及计算的地方需要注意格式。例如,在二分查找的时间复杂度可以提到$O(\log n)$,用行内格式。 另外,用户需要生成相关问题,我需要根据内容提出相关的扩展问题,比如性能优化、应用场景等。例如,动态初始化静态初始化的使用场景差异,或者冒泡排序的优化方法。 需要检查是否有遗漏的信息,比如内存划分在引用[4]中提到的Java虚拟机内存部分,可能需要简要说明数组在内存中的存储方式,但用户的问题可能更关注基础使用,所以这部分可以点到为止,或者简要提及。 还要注意引用标识的正确添加,例如在提到遍历时引用[1],初始化时引用[4],算法部分引用[3]。确保每个引用都自然出现在相关段落的末尾。 最后,确保回答结构清晰,分点明确,代码示例正确(根据引用中的Java代码),并且相关问题能够引导用户深入学习的兴趣。可能的问题包括数组的内存管理、多维数组的使用、性能比较等。需要根据现有引用内容生成相关问题,避免超出引用范围。</think>### Java数组系统化学习笔记 #### 一、数组定义初始化 Java数组是**相同数据类型元素的有序集合**,通过下标访问元素(从0开始)。初始化方式分为两种: 1. **动态初始化**(指定长度): `数据类型[] 数组名 = new 数据类型[长度];` 例如:`int[] arr = new int[5];` 此时元素自动获得默认值:整型为$0$,浮点型为$0.0$,布尔型为$false$,引用类型为`null`[^4]。 2. **静态初始化**(指定内容): `数据类型[] 数组名 = {元素1, 元素2, ...};` 例如:`int[] arr = {5, 15, 25};` 这种写法隐含了`new`操作,系统会自动替换默认值为指定值[^4]。 #### 二、数组遍历操作 遍历数组通常结合循环结构: ```java int[] arr = {10,20,30,40,50}; for(int i=0; i<arr.length; i++){ System.out.println(arr[i]); } ``` 通过索引操作元素时需注意**数组越界异常**(`ArrayIndexOutOfBoundsException`)[^1]。 #### 三、常见算法实现 1. **数组翻转**: 通过首尾元素交换实现: ```java for(int i=0, j=arr.length-1; i<j; i++,j--){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } ``` 2. **冒泡排序**: 时间复杂度为$O(n^2)$,通过相邻元素比较实现排序: ```java for(int i=0; i<arr.length-1; i++){ for(int j=0; j<arr.length-1-i; j++){ if(arr[j] > arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } ``` 3. **二分查找**: 要求数组**有序**,时间复杂度为$O(\log n)$: ```java int left=0, right=arr.length-1; while(left <= right){ int mid = left + (right-left)/2; if(arr[mid] == target) return mid; else if(arr[mid] < target) left = mid+1; else right = mid-1; } ``` #### 四、内存原理 数组在Java堆内存中分配连续空间。例如`int[] arr = new int[3];`会在堆中创建包含3个整型元素的连续内存块,栈内存中的引用变量`arr`存储该内存地址[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值