常见array用法: 赋值、反转、扩容、缩容、查找、排序
数组赋值****
典例:杨辉三角
class YangHui{
public static void main(String[] args){
int[][] yanghui = new int [10][];
for(int i=0;i<yanghui.length;i++){
yanghui[i]=new int [i+1];
//因为i从0开始遍历,所以声明内部数组时需写作i+1
yanghui [i][0]=1;
yanghui [i][i]=1;
//定义首尾数组元素
for(int j=1;j<yanghui[i].length-1;j++){
//j从1开始遍历,第一行只有yanghui[0][0]=1一个元素,且尾元素已经定义为1,所以遍历条件为j<yanghui[i].length-1.
yanghui [i][j]=yanghui [i-1][j]+yanghui[i-1][j-1];
}
}
for(int i=1;i<yanghui.length;i++){
for(int j=0;j<yanghui[i].length;j++){
System.out.print(yanghui[i][j]+"\t");
//遍历数组,显示杨辉三角的图形
}
System.out.println();
}
}
}
练习:定义一个数组,随机赋1-30以内的值,每个随机数各不相同。
public class RandomArray{
public static void main(String[] args){
int [] arr=new int [6];
for(int i=0;i<arr.length;i++){
arr[i] = (int)(Math.random()*30)+1; //赋随机值
for(int j=0;j<i;j++){
if(arr[j]==arr[i]){
i--;
break; //跳出当前的for循环,重新为arr[i]赋值
}
}
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]); //遍历输出
}
}
}
数组的反转、扩容、缩容****
3.1数组的反转Reverse
方法一:
class Reverse{
public static void main(String[] args){
int [] arr =new int []{1,2,3,4,5}; //static defination
for(int i=0;i<arr.length/2;i++){
int t=0;
t=arr[i];
arr[i]=arr[arr.length-1-i];
arr[arr.length-1-i]=t;
} //exchange by intermediate variable
for(int i=0;i<arr.length;i++){
System.out.println("a["+i+"]="+arr[i]);
}
}
}
方法二:(前置省略)
for(int i=0,j=arr.length-1;i<j;i++,j--){
int t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
for(int i=0;i<arr.length;i++){
System.out.println("a["+i+"]="+arr[i]);
}
3.2 数组的扩容
(1)new新数组
(2)迁移数组元素
public class Enlarge{
public static void main(String[] args){
int [] arr = new int []{1,3,5,7,9};
int [] newarr = new int [10];
for(int i=0;i<arr.length;i++){
int t=arr[i];
arr[i]=newarr[i];
newarr[i]=t;
}
for(int i=0;i<newarr.length;i++){
System.out.println("arr["+i+"]="+newarr[i]);
}
}
}
3.3 数组的缩容
(题目为删除下标为2的数组元素)
public class Shorten{
public static void main(String[] args){
int []arr=new int []{2,4,6,8,10};
int deleteindex = 2;
int [] newarr = new int [arr.length-1];
for(int i=0;i<arr.length-1;i++){
newarr[i]=arr[i];}
for(int i=deleteindex+1;i<arr.length;i++){
newarr[i-1]=arr[i];
}
arr=newarr;
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
数组的查找、冒泡排序、快速排序****
4.1查找
(1)顺序查找
class Array{
public static void main(String[] args){
int [] arr= {4,5,6,7,9};
int target =6;
boolean flag = true;
for(int i=0;i<arr.length;i++){
if(target==arr[i]){
System.out.println("the index is "+i);
flag = false;
break;
}
}
while(flag){
System.out.println("there is not the number in this array.");
}
}
}
(2)二分查找(数组必须有序)
1.定义首索引head与尾索引end,mid=(head+end)/2
循环条件:head<=end;
循环方式;while(head<=end)
class Mid{
public static void main(String[] args){
int []arr={1,3,6,8,14,32,64,87};
int head = 0;
int end = arr.length-1;
boolean flag = true;
int target = 32;
while(head<=end){
int mid = (head+end)/2;
if(arr[mid]==target){
flag = false;
System.out.println("The number is founded! Its index is "+ mid);
break;
}
else if(arr[mid]<target){
head=mid+1;
}
else
{end = mid-1;}
}
if(flag){
System.out.println("Sorry,I didn't find the target.");
}
}
}
4.2 排序 (1)冒泡排序 class Bubbling{ public static void main(String[] args){ int []arr={33,55,66,37,45,29}; for(int i=0;i<arr.length;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ int t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; } } } for(int i=0;i<arr.length;i++){ System.out.println("arr["+i+"]="+arr[i]); } } }
(2)快速排序:
衡量排序算法的优劣:
时间复杂度、空间复杂度、稳定性
排序思想:
1. 从数列中挑出一个元素,称为"基准"(pivot),
2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
4. 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。