数组
概念
一组连续的存储空间,存储多个相同数据类型(相对的)的值
查询快
特点
- 类型相同,长度固定
new出后长度不可变
创建
//声明 分配空间 赋值 使用
int[] a = new int[5];//可以存储5个int值
Arrays.toString(a);
默认值
整数:0
浮点数:0.0
char:\u0000
布尔:false
其他:null
数组扩容
- 值类型存法
- 栈里面存值
- 引用类型
- 栈里面存地址,堆里面存值
- 创建新数组
- 将旧数组中的值赋值到新数组
-
方法(需要什么,返回什么)
int[] arrs = new int[5];
//扩容
arrs = Arrays.copyOf(arrs,arrs.length+3);//数组,长度
//打印数组
Arrays.toString(arrs);
//排序
Arrays.sort(arrs); //做了优化
排序
原因:为了查询
排序算法:冒选插 快堆希归 桶计基
快堆希
-
冒泡排序(n*n)
-
选择排序(n*n)
-
插入排序(n*n)
-
快速排序(n*logn)找基准
-
堆排序(n*logn)
-
希尔排序(n*logn)gap
-
归并排序(n*logn)
线性表的合并
[1,2,6,9]+[2,5,6,7] -
桶排序(n)
放在不同范围中放入范围内数并排序 -
计数排序(n)
记录数字的多少 -
基数排序 (n)
按个位十位等排序;
查找
- 二分查找
int nums = {1,2,3,3,3,3,3,4,5,6,7,8,8,8,8}
int num = 3;
int start = 0;
int end = nums1.length-1;
int mid;
while(start<=end){
mid = (start+end)/2;
if(num==nums[mid]){
return mid;
}else if(nums[mid]>num){
end = mid-1;
}else{
start = mid+1;
}
}
jdk的实现:
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;//mid=(start+end)/2;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
//返回值在如果没找到的情况下,取反代表插入位置,找到的话,找到的位置就是插入位置
插入
-
找到插入位置:
-
扩容:{1,2,3,5,6,0}
-
从3开始把数据往后移{1,2,3,5,5,6}
-
插入{1,2,3,4,5,6}
public static void main(String[] args) {
//{1,2,3,5,6}
int[] nums = {1,2,3,5,6};
//插入4:
int num = 4;
// 1、找到插入位置:3
int index;
int res = Arrays.binarySearch(nums, num);
index = res>=0?res:-res-1;
System.out.println(index);
// 2、扩容:{1,2,3,5,6,0}
nums = Arrays.copyOf(nums, nums.length+1);
// 3、从3开始把数据往后移{1,2,3,5,5,6}
for(int i=nums.length-1;i>index;i--) {
nums[i]=nums[i-1];
}
nums[index] = num;
System.out.println(Arrays.toString(nums));
// 4、插入{1,2,3,4,5,6}
}
//最简单的插入
// 最最后添加
//
//{1,2,3,0,0,0}
// 找空位
删除
{1,2,3,4,5}--->{1,2,4,5,0}
- 找到删除位置:
- 从删除位置开始把数据往前移{1,2,4,5,5}
- 最后变0
二维数组 (数组的数组)
//杨辉三角
public static void main(String[] args) {
int[][] nums = new int[10][];
//循环生成列
for(int i=0;i<nums.length;i++) {
nums[i] = new int[i+1];
}
//添加数值
for(int i=0;i<nums.length;i++) {
nums[i][0] = 1;
nums[i][i] = 1;
for(int j=1;j<nums[i].length-1;j++) {
nums[i][j] = nums[i-1][j-1]+nums[i-1][j];
}
// int[] row = nums[i];//第几行
// row[0] = 1;
// row[i] = 1;
// for(int j=1;j<row.length-1;j++) {
// int[] pre = nums[i-1];//上一行
// row[j] = pre[j-1]+pre[j];
// }
}
for (int i = 0; i < nums.length; i++) {
System.out.println(Arrays.toString(nums[i]));
}
}
main方法允许输入输出,其余地方不准输入输出
应用类型存的地址(堆中)
定义的数组名
↓
栈空间存的数组地址(栈中地址)(栈里完成赋值)
↓
数组数据存在堆中(堆中地址)(无人引用,垃圾)
↓
垃圾回收机制 引用类型
动态回收无任何引用的对象占据的 堆内存 空间
程序调试
- 跳入:跳入方法里面去执行
- 跳过:跳过方法执行
- 返回:返回
标签:nums,int,mid,Arrays,数组,排序 来源: https://www.cnblogs.com/chahune/p/16426363.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。