数组详解

数组的定义:

    数组是用来存储相同数据类型的有序数据结构;

数组的创建:

    第一种形式:数据类型[] 名称

    第二种形式:数据类型 名称[]

数组的初始化:

    第一种形式:声明创建,并分配存储空间赋值

                    int[] a = {1,2,3,4,5};

    第二种形式:显式初始化

                    int[] a = new int[]{1,2,3,4,5};

    第三种形式:显式初始化

                    int[] a = new int[5]

    创建形式的区别:

        第一种形式直接声明,进行空间分配,赋值,但是不能够分开,即不能先声明创建,之后赋值,必须一起;

        第二种形式和第三种形式可以分开,第二种形式可以直接赋值,第三种形式可以指定数组长度;

        数组创建首先分配内存,内存不能够改变,所以数组一经创建不能够修改数组长度;

数组的存储:

    创建一个数组:int[] a = new int[](10);

    首先我们需要jvm的存储结构,基本类型以及引用类型存放于栈内存中,其生命周期由作用域直接确定,new创建的对象以及数组存放于堆内存中,由jvm的垃圾回收机制进行处理;明白了这一点之后,我们对上面的数组创建进行剖析:

    a:引用类型,存放于栈

    new:创建出来的对象存放于堆

    a其实就是指向new创建出来的数组对象在内存中的地址,或者叫做对象句柄;

数组的排序:

    第一种形式:冒泡排序

        排序思想:重复进行排序,每次排序依次比较相邻的两个元素,每次排序都将得到本轮的最大值;

        排序轮数:arr.length

        排序比较次数:arr.length * arr.length

        时间复杂度:O(n*n)

        核心代码:        

int arr[] = new int[]{8,5,12,4,9,7,10,0,6};
for(int i = 0; i < arr.length - 1; i ++){
    for( int j = 1; j < arr.length; j ++){
        if (arr[j] < arr[j - 1]) {//每一次比较相邻的两个元素
            int temp = arr[j];
            arr[j] = arr[j - 1];
            arr[j - 1] = temp;
        }
    }
    System.out.println(Arrays.toString(arr));
}

    第二种形式:快速排序

        排序思想:每一趟排序都把数组分成两部分,一侧的数据都要比另一侧的数据大

        核心代码:

public static void sort(int[] a,int low,int high){
    int start = low;
    int end = high;
    int key = a[low];
    while(end>start){//从后往前比较
        while(end>start&&a[end]>=key) end--;//如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
        if(a[end]<=key){
            int temp = a[end];
            a[end] = a[start];
            a[start] = temp;
        }
        while(end>start&&a[start]<=key){//从前往后比较
            start++;//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
        }
        if(a[start]>=key){
            int temp = a[start];
            a[start] = a[end];
            a[end] = temp;
        }//此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
    }
    //递归
    if(start>low) sort(a,low,start-1);//左边序列。第一个索引位置到关键值索引-1
    if(end<high) sort(a,end+1,high);//右边序列。从关键值索引+1到最后一个
}

    第三种形式:插入排序

        排序思想:将数组分成有序部分和无序部分,每次将无序部分的第一个元素插入到有序部分并排序;

        排序轮数:arr.length - 1

        排序比较次数:(arr.length - 1 ) + ... + 1 = arr.length * (arr.length - 1)/2

        时间复杂度:理想情况O(n),最坏情况O(n*n)

        核心代码:

int[] arr = new int[]{8,5,12,4,9,7,10,0,6};
for (int i = 1; i < arr.length; i++){
    int j = i;
    int target = arr[i];
    while (j > 0 && target < arr[j - 1]) {
        //已经排序元素arr[j]和待排序元素进行比较,如果待排序小于已排序。进行交换
        //交换后,继续重复上面的比较;
        arr[j] = arr[j - 1];
        j--;
    }
    arr[j] = target;
    System.out.println(arr[j]);
    System.out.println(Arrays.toString(arr));
}

    第四种形式:选择排序

        排序思想:每一轮都从数组中取出本次最小的值,然后放入一个本次排序的起始位置

        排序轮数:arr.length 

        排序比较次数:arr.length*(arr.length+1)/2

        时间复杂度:O(n*n)

        核心代码:

int arr[] = new int[]{8,5,12,4,9,7,10,0,6};
for (int i = 0; i < arr.length - 1; i ++){
    for(int j = i + 1; j < arr.length; j ++){
        if(arr[j] < arr[i]){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    System.out.println(Arrays.toString(arr));
}

猜你喜欢

转载自blog.csdn.net/m0_38003171/article/details/80762214