一 数组
1.概念: 所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作。数组本身 属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配,数组变量是引用地 址)型变量
2.数组相关概念:
数组名
元素
角标、下标、索引
数组的长度:元素的个数 length
3.数组的特点:
数组是有序排列的
数组属于引用数据类型的变量。数组的元素,可以是基本数据类型,也可以是引用数据类型
创建数组对象会在内存中开辟一整块连续的空间
数组的长度一旦确定,就不能更改。
4.数组的分类
按照维数:一维数组、二维数组、... ...
按照数组元素的类型:基本数据类型元素的按钮、引用类型元素的数组
5 数组的定义
1
、声明并开辟数组
元素类型 [] 数组名 = new 元素类型 [ 元素个数或数组长度 ];示例: int [] arr = new int [ 5 ];初始化操作arr [ 0 ] = 10 ;
2、静态初始化数组
数组先开辟内存空间,而后再使用索引进行内容的设置,实际上这种做法都叫做动态初始化,而如果希 望数组在定义的时候可以同时出现设置内容,那么就可以采用静态初始化完成。
元素类型 [] 数组名 = new 元素类型 []{ 元素,元素, …… };int [] arr = new int []{ 3 , 5 , 1 , 7 };int [] arr = { 3 , 5 , 1 , 7 };
注:使用new关键字分配内存时,简单类型的数组中的元素都有初始值
数组元素的默认初始化值
数组元素是整型:0
数组元素是浮点型:0.0
数组元素是char型:0或'\u0000',而非'0'
数组元素是boolean类型:false,Oracle的JVM中采用byte[]方式进行存储
二 冒泡排序
1.算法说明
1)比较相邻的元素。如果第一个比第二个大,就交换它们两个。
2)对每一对相邻的元素都进行比较,等所有的比较完后最后一个数字是这堆数据里的最大数字。
3)重复步骤一,直到排序完成
2.冒泡排序 时间复杂度为O( n^2 );空间复杂度为O(n);,是稳定的算法。
3.源码
public static void main(String[] args) {
//冒泡排序方法
long s1=System.currentTimeMillis();
double[] arr= {12.9,53.54,75.0,99.1,3.14};
for(int k=1;k<arr.length;k++) {
for(int i=0;i<arr.length-k;i++) {
if(arr[i]>arr[i+1]) {
double tmp =arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
}
long e1=System.currentTimeMillis();
System.out.println("排序用时为"+(e1-s1)+"ms");
for(double tmp:arr) {
System.out.print(tmp+"\t");
}
}
三 折半查找
1.定义
折半查找法:在计算机科学中,折半搜索,也称二分搜索(英语:binary search)、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
2.条件 数组有序
3.源码
package com.chang2;
public class 练习 {
public static void main(String[] args) {
// 折半查找
//产生随机数
int []arr =new int[21];
for(int i=1;i<arr.length;i++) {
int r =(int)(Math.random()*100);
arr[i]=r;
}
arr[0]=33;
//冒泡排序
for(int i=1;i<arr.length;i++) {
for(int k=0;k<arr.length-i;k++) {
if(arr[k]>arr[k+1]) {
int tmp=arr[k];
arr[k]=arr[k+1];
arr[k+1]=tmp;
}
}
}
for(int tmp : arr)
System.out.print(tmp+" ");
System.out.println();
//折半查找
int target =33;
int pos= -1;
int m1=0;
int m2=arr.length-1;
boolean flag=false;
while(m1<m2) {
pos=(m1+m2)/2;
if(arr[pos]>target) {
m2=pos-1;
}else if(arr[pos]<target) {
m1=pos+1;
}else {
flag=true;
break;
}
}
if(flag)
System.out.println(pos+"::"+arr[pos]);
else
System.out.println("找不到");
}
}