1 数组

数组是编程语言中最常见的的数据结构,其本身是个引用类型数据。

java数组要求所有的数组元素具有相同的数据类型。

一旦数组的初始化完成,数组在内存中所占的空间将被固定下来,数组的长度将不可变

数组既可以存储基本类型数据,也可以存储引用类型数据

1.2 数组初始化

数组初始化有两种方式:

静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度

动态初始化:初始化时程序员只指定数组长度,由系统为数组分配初始值

1.2.1 静态初始化

语法格式:

1.3 堆内存、栈内存、引用变量

Java把内存划分成两种:一种是栈内存,一种是堆内存。

栈内存:

在方法中定义的一些基本类型的变量和对象的引用变量都是在方法的栈内存中分配。

当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

运行速度快,主要用来执行程序。

堆内存:

堆内存用于存放由new创建的对象和数组。

在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。

运行速度慢,主要用于创建数组、对象。

引用变量与栈内存、堆内存的关系:

在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量。

引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组和对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的引用变量指向堆内存中的变量(数组或对象本身),这就是 Java 中的指针!

1.4 数组遍历

数组通过下标访问,下标范围【0 ~ 数组长度-1】

如果数组下标越界,编译时不会出现异常,运行时会报

java.lang.ArrayIndexOutOfBoundsException:N(数组索引越界异常)

1.5 foreach循环

java5之后,java提供foreach 循环遍历数组和集合更加简洁

使用foreach 循环遍历数组和集合元素时,无须获得数组和集合长度,无须用下标来访问数组元素和集合元素

语法格式:

2 数组变量内存分析

数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可以通过该数组变量来访问数组元素。

实际的数组对象被存储在堆(heap)内存中

如果引用该数组对象的数组引用变量时一个局部变量,那么他被存储在栈(stack)内存中。

栈内存:所有在方法中定义的局部变量都是放到栈内存中,随着方法的执行结束,这个方法的内存栈也将自然销毁。

堆内存:当在程序中创建对象,这个对象将保存堆内存中,堆内存不随着方法执行结束而销毁,只有当对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。

示例:

动态初始化后,系统内存中实际产生了6块内存区(堆内存),分配默认值0

arr变量引用指向数组本身

arr变量通过下标找到数组中的第三块内存,然后把值改为90

3 方法参数传递之数组

数组类型传入方法的参数是个数组的首地址。

如果在方法内对数组的元素改变,当方法执行完,方法外该数组的元素也随着改变。

4 数组的应用

4.1 数组的拷贝

判断两个数组元素是否相等

4.3 数组排序

排序的目的是为了能快速的查找

排序分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序;如果排序过程中需要使用外存(硬盘、软盘、光盘、U盘等),则称为外排序。

内排序可以分为以下几类:

(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。

(2)、选择排序:简单选择排序、堆排序。

(3)、交换排序:冒泡排序、快速排序。

(4)、归并排序

(5)、基数排序

由于时间的关系,只讲具有代表性的冒泡排序、选择排序和快速排序。

下面各种排序算法,以升序为例,讲解

4.3.1 冒泡排序

交换排序的一种

思想:

先拿数组下标0 的元素 与 数组内下标>0的元素进行比较,只要其他元素比下标0元素小,则进行元素交换,直到下标0 元素与其他都比较完。

然后再拿下标1的元素 与 数组内下标 >1 的元素进行比较,只要比下标1的小,则进行元素交换,直到下标1 元素与 >1的元素都比较完。

以此类推

直到length-1元素都比较完成 。

分析:

•若文件初状为正序,则一趟起泡就可完成排序,排序码的比较次数为n-1,且没有记录移动,时间复杂度是O(n)

•若文件初态为逆序,则需要n-1趟起泡,每趟进行n-i次排序码的比较,且每次比较都移动n-1次,比较和移动次数均达到最大值∶O(n2)

•起泡排序平均时间复杂度为O(n2)

4.3.2 简单选择排序

选择排序的一种

思想:

给定数组:int[] arr={里面n个数据};

第1趟排序,在待排序数据arr[0]~arr[n-1]中选出最小的数据,将它与arrr[0]交换;

第2趟,在待排序数据arr[1]~arr[n-1]中选出最小的数据,将它与arr[1]交换;

以此类推

第i趟在待排序数据arr[i]~arr[n-1]中选出最小的数据,将它与arr[i-1]交换,直到全部排序完成。

简单选择排序是不稳定的排序。

时间复杂度:T(n)=O(n2)。

4.3.3 快速排序

交换排序的一种

采用分治法的思想 :

首先,说说分治的思想。分治, “分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

分治通过减小问题规模,对问题各个击破,其策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

分治法的基本步骤

分治法在每一层递归上都有三个步骤:

step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;

step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题

step3 合并:将各个子问题的解合并为原问题的解。

快速排序思想:

下面有个a数组,有7个元素,取下标0的元素为基准数

初始时,low = 0; high = 6; tmp = a[0] = 4;

先用挖坑填数法,直至 low >= high ,找到要分割的基准依据,基准数左面是小于等于基准数的元素,基准数右面是大于等于基准数的元素。

由于已经将 a[0] 中的数保存到 tmp 中,可以理解成在数组 a[0] 上挖了个坑,可以将其它数据填充到这来。

从 high 开始向前找一个 小于tmp 的数。当 high=6 时,符合条件,将 a[6] 挖出再填到上一个坑 a[0] 中。a[0]=a[6];这样一个坑a[0]就被搞定了。

但又形成了一个新坑a[6],这怎么办了?简单,再找数字来填 a[6]这个坑。

从 low 开始向后找一个大于tmp的数,当i=2,符合条件,将 a[2] 挖出再填到上一个坑中,a[6] = a[2];

此时,又形成了一个新坑a[2]

经过第一轮后,结果如下:

现在 low = 2; high = 6; tmp =4; 然后继续用挖坑填数法

从 high 开始向前找一个 小于tmp 的数。当 high=3 时,符合条件,将 a[3] 挖出再填到上一个坑 a[2] 中

形成新坑a[3],

从 low 开始向后找一个大于tmp的数,当 low = 3 时,low >= high, 此次循环结束。(循环结束的前提是 low >= high)

然后把新坑a[3] 用 tmp填上,a[3] = tmp 。所有坑都已填满。

经过上面的过程,已经找到基准位置

此时,数组内容如下:

因此再根据分治法对a[0…2]和a[4…6]这二个子区间重复上述步骤,直到将数组分割成一个一个的元素为止。

分析:

快速排序是不稳定的排序。

快速排序的时间复杂度为O(nlogn)。

当n较大时使用快排比较好,当序列基本有序时用快排反而不好。

时间复杂度是度量算法执行的时间长短,时间复杂度常用大O符号表述

空间复杂度是度量算法执行时运用空间的大小,空间复杂度常用大O符号表述

三种排序的对比:

排序算法选择

数据规模较小

对稳定性不作要求宜用简单选择排序

对稳定性有要求宜用冒泡

数据规模不是很大

完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出log(N)的额外空间。

序列初始基本有序(正序),宜用冒泡

4.4 数组的查找

4.4.1 一般查找

数组可有序,也可无序。

key = 10;

查这个key在数组中的位置,如果找到返回数组下标

如果没找到,返回-1

search方法:

java原始类型排序_海牛部落 java 系列教程:(5)数组和排序相关推荐

  1. java 不同类型 映射_如何使用Java泛型映射不同的值类型

    java 不同类型 映射 有时,一般的开发人员会遇到这样的情况,即他必须在特定容器内映射任意类型的值. 但是,Java集合API仅提供与容器相关的参数化. 例如,这将HashMap的类型安全使用限制为 ...

  2. java布尔类型比较器_浅谈Java中几种常见的比较器的实现方法

    在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...

  3. [转载] java中对数组进行排序_如何在Java中对数组排序

    参考链接: Java中main()的有效变体 java中对数组进行排序 Java Array is like a container that can hold a fixed number of t ...

  4. java中对数组进行排序_如何在Java中对数组排序

    java中对数组进行排序 Java Array is like a container that can hold a fixed number of the same type of items, ...

  5. java原始类型和引用类型_Java中的8种原始类型

    java原始类型和引用类型 几年前,当我开始编辑Java Basics系列时,我认为将一些非常详细的信息拉到自己的帖子中是很有意义的. 这样,初学者的内容就更容易消化了. 首先,我将介绍有关Java的 ...

  6. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  7. 多维数组的索引与切片_「GCTT 出品」Go 系列教程——11. 数组和切片

    Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获! Go 系列教程是非常棒的一套初学者教程,入门就它了. 「GCTT 出品」Go 系列教程--1. 介绍与安装 「GCTT 出品」 ...

  8. java arraylist排序_最全Java集合笔记

    集合概述 什么是集合 集合框架:用于存储数据的容器. 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实现和对集合运算的算法. 接口:表示集 ...

  9. java数字大小排序_怎么用java给数字排大小?

    将数字从大到小排序的方法: 例如简一点的冒泡排序,将第一个数字和后面的数字逐个比较大小,如果小于,则互换位置,大于则不动.此时,第一个数为数组中的最大数.然后再将第二个数与后面的数逐个比较,以次类推. ...

最新文章

  1. AI中pass架构设计优化
  2. springboot2处理跨域
  3. 汇编语言的简答入门--斐波那契数列(递归)
  4. matlab中ncread读取nc文件其中一个三维参数的其中一维_Matlab使用技巧总结-1
  5. java office web apps_应用程序与 Office Web Apps 整合
  6. CodeForces - 589D
  7. Linux中的文件权限
  8. Linux下nautilus的右键快捷菜单项设置
  9. hive select 语句
  10. ZigBee模块无线通信组网结构技术之Mesh拓扑网状
  11. 百度快照劫持的表现及解决方法
  12. python自动爬取更新电影网站_Python爬虫之—微信实时爬取电影咨询
  13. c# 转换Image为Icon
  14. 股票交易接口开发原理是什么?
  15. Idea的快捷功能使用统计
  16. python的标准库turtle_Python标准库使用之使用turtle绘制奥林匹克五环
  17. 计算机sci期刊必需要提交原始数据,sci投稿的时候需要附上原始数据和处理过程么...
  18. HTML5学习:第一阶段03
  19. 用Verilog实现串并转换
  20. python解决换零钱问题_多种解法解决“零钱兑换”问题

热门文章

  1. 黄一老师分享一些申卡技巧让咔快到你的钱包里来!
  2. OCZ RevoDrive3x run smartctl ERR: sda: Current [descriptor]: sense key: Recovered Error
  3. el属性和template属性的关系
  4. html网页设计代码作业——酥麻辣祸-美食餐饮 HTML+CSS+JavaScript 学生DW网页设计
  5. 兼容IE浏览器下对比两个时间大小
  6. 物理界炸了!21℃实现室温超导,Nature凌晨刊发撤稿团队新研究,赌城现场被人群挤爆...
  7. 【Code皮皮虾】双栈 + 贪心 思路讲解、代码实现——>【有效的括号字符串】
  8. 【火山RTC】千人聊天、直播连麦、云渲染
  9. fedora-MEPG
  10. Android模拟器使用SD卡