三.数组、排序和查找
1.数组使用
-
数组是一种数据类型,是引用类型
-
**一个快捷小技巧:**使用shift+ctrl+D可以快速复制当前行
-
数组的初始化
//动态初始化
//(1)第一种
int a[] = new int[3];//创建了一个数组,名字为a,大小为3,相当于声明和分配空间
//(2)第二种
int a[]; //声明
a = new int [3];//分配空间
//静态初始化
int a[] = {1,2,3,5,9};
- 数组创建后,如果只声明却没有赋值,有默认值 (int short byte long)0、(float double)0.0、(char)\u0000、(boolean)false、(string)null
- String类型小坑
String[] strs = {'a','b','c'};//error
String[] strs = {"a","b","c"};//OK
//字符串类型的数组,每一个元素都要是字符串(""),不能是字符('')
String[] strs = new String[]{"a","b","c"};//OK
String[] strs = new String[3]{"a","b","c"};//error
//如果把声明、分配内存和赋值放在一句,那分配空间不能给大小
2.数组赋值
- 基本数据类型的赋值,赋值方式为值传递(值拷贝); 数组在默认情况下是引用传递(引用拷贝),赋的值是地址,赋值方式为引用赋值
3.数组翻转、扩容、缩减
- 翻转考虑(2)原地前后两两互换 (2)或者重申请新内存来赋值
- 扩容考虑(1)定义新数组(大小增加),然后遍历逐个赋值,并使原来的数组重新指向新地址***(注意:Java的垃圾收集器会周期性地检查程序中不再使用的对象并释放其内存空间)***
- 缩减考虑(1)定义新数组(大小减小),然后遍历逐个赋值,并使原来的数组重新指向新地址
4. 排序
- 分为内部排序(将所有数据加载到内部存储器中进行排序)和外部排序(无法全部加载到内存中,需要借助外部存储进行排序)
- 冒泡排序
public class ArrayDetail{
public static void main(String[] args) {
//冒泡排序
int a[] = {24,69,80,57,13};
int temp,n=a.length;
//外层循环执行n-1次,每次使一个最大元素"冒泡"到未排好序的最后位置
//当n-1个元素都在排好序的位置后,第一个也就已经在最前边了不需要再交换位置
for(int i=0;i<n-1;i++){
//内层循环用来判断相邻两个大小,未排序好的数有n个就需要两两比较n-1次
//每次未排序好的数的个数等于n-i
for(int j=0;j<n-i-1;j++){
//借用暂存变量进行交换
if(a[j]>a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
//输出结果 13 24 57 69 80
for(int i=0;i<n;i++){
System.out.print(a[i]+"\t");
}
}
}
5.查找
- 常见的分两种:顺序查找和二分查找
6.二维数组
- 数组的初始化
//动态初始化
//(1)第一种
int[][] a = new int[3][3];//创建了一个二维数组,名字为a,大小为3*3,相当于声明和分配空间
//(2)第二种
int[][] a; //声明
a = new int [3][3];//分配空间
//(3)第三种:列数不确定
int [][] a = new int[3][];
for(int i=0;i<a.length;i++){
a[i] = new in[i+1];
}
//静态初始化
int[][] a = {{1,2,3,5,9},{1,6,9,4,},{5,9}};//每个元素可以长度不同
7.练习题
- 已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序,思路是,先扩容把插入元素放最后,再进行排序
import java.util.Scanner;
public class Homework04{
public static void main(String[] args) {
/*
已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序
*/
int[] a = {10, 12, 45, 90};
int n = a.length;
Scanner MyScanner = new Scanner(System.in);
while (true) {
System.out.println("=================分割线=================");
System.out.print("当前数组元素为: ");
for(int i = 0; i < n; i++){
System.out.print(a[i]+"\t");
}
System.out.print("\n是否要插入数据? y/n: ");
char y = MyScanner.next().charAt(0);
if (y == 'n') {
break;
}
System.out.print("请输入要插入的数值:");
int x = MyScanner.nextInt();
int[] sums = new int[n+1];
for(int i = 0; i < n; i++) {
sums[i] = a[i];
}
sums[n] = x;
n++;
a = sums;
sort(a);
}
}
private static void sort(int[] a) {
//冒泡排序
int temp,n=a.length;
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (a[j] > a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
}