数组和排序

目录

数组

声明和创建

内存分析

三种初始化

数组边界

小结

数组使用

数组作方法入参

数组作返回值

多维数组

Arrays 类

打印数组

数组排序

二分法查找

元素填充

数组转换为List集合

常见排序算法

冒泡排序

选择排序

稀疏数组

 

数组

声明和创建

//声明
dataType[] arrayRefVar; // 首选的方法  int[] a; double[] a
 或
dataType arrayRefVar[]; // 效果相同,但不是首选方法
//创建数组
arrayRefVar = new dataType[arraySize]; // a = new int[10];
//声明 + 创建
dataType[] arrayRefVar = new dataType[arraySize]; // int[] a = new int[10];
//获取数组长度
arrays.length
public static void main(String[] args) {
 //1.声明一个数组
 int[] myList = null;
 //2.创建一个数组
 myList = new int[10];
 //3.像数组中存值
 myList[0] = 1;
 myList[1] = 2;
 myList[2] = 3;
 myList[3] = 4;
 myList[4] = 5;
 myList[5] = 6;
 myList[6] = 7;
 myList[7] = 8;
 myList[8] = 9;
 myList[9] = 10;
 // 计算所有元素的总和
 double total = 0;
 for (int i = 0; i < myList.length; i++) {
 total += myList[i];
 }
System.out.println("总和为: " + total);
 }

内存分析

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

三种初始化

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

 数组的默认初始化;

数组边界

//下标的合法区间:[0, length-1],如果越界就会报错;
public static void main(String[] args) {
 int[] a=new int[2];
 System.out.println(a[2]);
 }




Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2   //数组下标越界异常!

小结

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

数组使用

我们通常使用基本循环或者 For-Each 循环。
 
普通for循环:
例1:
//打印全部数组元素

 public static void main(String[] args) {
        int[] a ={1,2,3,4,5 } ;  //静态初始化   “写死!”

        for (int i = 0; i <a.length ; i++) {
            System.out.println(a[i]);

        }

    }

例2: 

//计算所有元素的和
 public static void main(String[] args) {
        int[] a={1,2,3,4,5};
        int sum=0;
        for (int i = 0; i < a.length; i++) {
            sum+=a[i];
        }
        System.out.println(sum);
    }

例3: 

For-Each 循环

 

被称为 For-Each 循环或者加强型循环,它能在不使用下标的情况下遍历数组。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16
for(type element: array){
 System.out.println(element);
 }
public static void main(String[] args) {
 double[] myList = {1.9, 2.9, 3.4, 3.5}; // 打印所有数组元素
 for (double element: myList) {   //遍历数组:数组
 System.out.println(element);
 }
 }

数组作方法入参

//打印数组元素

public static void main(String[] args) {
     int[] a={1,2,3,4,5};
     printArray(a);
}

public static void printArray(int[] array) {  

 for (int i = 0; i < array.length; i++) {
 System.out.print(array[i] + " ");
 
}
 }

数组作返回值

//反转数组
public static int[] reverse(int[] list) {
 int[] result = new int[list.length];
 for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
 result[j] = list[i];
 }
return result;
 }

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

多维数组

type[][] typeName = new type[typeLength1][typeLength2];  //二维数组
输出:

 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16获取数组长度:

a.length获取的二维数组第一维数组的长度,a[0].length才是获取第二维第一个数组长度。

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

 输出数组每个元素:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

Arrays

Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不需要"使用对象来调用
java.util.Arrays 类能方便地操作数组. 使用之前需要导包!

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

打印数组

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

数组排序

public static void main(String[] args) {
 int[] a = {1,2,323,23,543,12,59};
 System.out.println(Arrays.toString(a));
 
Arrays.sort(a);//对数组进行排序
 System.out.println(Arrays.toString(a));
 }

 

二分法查找

//使用二分搜索法来搜索指定的数组,以获得指定的值。
//必须在进行此调用之前对数组进行排序(通 过sort方法等)。如果没有对数组进行排序,则结果是不确定的。

public static void main(String[] args) {
 int[] a = {1,2,323,23,543,12,59};
 Arrays.sort(a); //使用二分法查找,必须先对数组进行排序
 System.out.println("该元素的索引:"+Arrays.binarySearch(a, 12));
 }

元素填充

//元素填充
public static void main(String[] args) {
        int[] a = {1,2,323,23,543,12,59};

    Arrays.sort(a); //使用二分法查找,必须先对数组进行排序
     Arrays.fill(a, 2, 4, 100); //将2到4索引的元素替换为100
    System.out.println(Arrays.toString(a));//[1, 2, 100, 100, 59, 323, 543]
}
}

数组转换为List集合

int[] a = {3,5,1,9,7}; 
List<int[]> list = Arrays.asList(a);

常见排序算法

冒泡排序

原理:

1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会
是最大的
数。
3. 针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
import java.util.Arrays;

public class D18 {
    public static void main(String[] args) {
        int[] array = {1,2,5,6,89,65,45,3,2};  
        int[] arrays = arrays(array);
        System.out.println(Arrays.toString(arrays)); //Arrays类打印
    }

    public static int[] arrays(int[] array) {

        int temp = 0;  //定义临时变量
        for (int i = 0; i < array.length - 1; i++) {//外层循环,控制循环次数;-1为了防止溢出
            for (int j = 0; j < array.length - 1 - i; j++) { //内层循环,控制相邻两个数比较
                if (array[j + 1] > array[j]) {            //冒泡排序
                    temp = array[j];
                    array[j] = array[j + 1];
                    array[j] = temp;
                }
            }
         

        }
        return array;
    }

}

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

选择排序

选择排序(Selection sort)是一种简单直观的排序算法。
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
class SelectSort{
 public int[] sort(int arr[]) {
 int temp = 0;
 for (int i = 0; i < arr.length - 1; i++) {// 认为目前的数就是最小的, 记录最小数的下标
 int minIndex = i;
 for (int j = i + 1; j < arr.length; j++) {
 if (arr[minIndex] > arr[j]) {// 修改最小值的下标
 minIndex = j;
 }
 }
// 当退出for就找到这次的最小值,就需要交换位置了
 if (i != minIndex) {//交换当前值和找到的最小值的位置
 temp = arr[i];
 arr[i] = arr[minIndex]
 arr[minIndex] = temp;
 } 
}
return arr;
 }
public static void main(String[] args) {
 SelectSort selectSort = new SelectSort();
 int[] array = {2, 5, 1, 6, 4, 9, 8, 5, 3, 1, 2, 0};
 int[] sort = selectSort.sort(array);
 for (int num : sort) {
 System.out.print(num + "\t");
 }
 }
 }

稀疏数组

package base;

public class D20 {

    public static void main(String[] args) {
        //创建一个二维数组:11行11列
        int[][] a= new int[11][11];
        a[0][0]=1;  //0行0列元素数值为1
        a[0][8]=1;   //0行8列元素数值为1   其余数值默认为0  相当于往数组里放两颗棋子
        //输出原始的数组
        System.out.println();
        //增强for循环  for(元素类型 循环变量:集合)
        for (int[] ints:a) {  //取行
            for (int anInt:ints)  //取列
            {
                System.out.print(anInt+" ");
            }
            System.out.println();
        }
    }
}

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

 //转为稀疏数组储存
        int sum=0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j <11 ; j++) {
                if (a[i][j] != 0) {
                    sum++;  //获取有效值个数
                }
            }
        }
        //创建稀疏数组
        int[][] a2=new int[sum+1][3];
        a2[0][0]=11;//行
        a2[0][1]=11;//列
        a2[0][2]=sum;//有效值
        //遍历二维数组,将非零的值,储存在稀疏数组中
        int count=0;
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a.length; j++) {
                if(a[i][j]!=0) {
                    count++;
                    a2[count][0] = i;
                    a2[count][1] = j;
                    a2[count][2] = a[i][j];
                }
            }
        }
        //输出稀疏数组
        for (int i = 0; i < a2.length; i++) {
            System.out.println(a2[i][0]+"\t"+a2[i][1]+"\t"+a2[i][2]+"\t");
        }
      /*
       //输出稀疏数组
        for (int[] value : a2) {
            System.out.println(value[0] + "\t" + value[1] + "\t" + value[2] + "\t");
       }
      */
    }
}

ecdba5bb80b8490b80637bc495742926.png

// 还原稀疏数组
        

//读取稀疏数组
        int[][] a3=new int[a2[0][0]][a2[0][1]];  
       // int[][] a3;  a3 = new int[a2[0][0]][a2[0][1]];
       
 //给其中的元素还原他的值
        for (int i = 1;  i< a2.length-1; i++) {
            a3[a2[i][0]][a2[i][1]] = a2[i][2];
        }
       
 //打印稀疏数组
        for (int[] ints:a) {  //取行
            for (int anInt:ints)  //取列
            {
                System.out.print(anInt+" ");
            }
            System.out.println();
        }

 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAaXNfa2Q=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb2xpbmd5ZQ==,size_16,color_FFFFFF,t_70

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值