一天一个Java基础——数组

一天一个变成了几天一个,最近接受的新东西太多、太快,有好多需要blog的但没有时间,这些基础知识应该是要深挖并好好研究的,不应该每次都草草了事,只看个皮毛。

数组:

  JVM将数组存储在一个称为堆(heap)的内存区域中,堆用于动态内存分配,在堆中内存块可以按随意的顺序分配和释放
  1.int[] a; ——表示声明一个数组(也可写为 int a[];)
    声明一个数组变量时并不在内存中给数组分配任何空间,只是创建一个对数组的引用的存储位置
    如果变量不包含对数组的引用,那么这个变量的值为null
    通过new操作符创建数组
    使用数组初始化语法时,必须将声明、创建和初始化数组都放在一条语句中,如下面代码是错误的:
      

double[] myList;
myList = {1, 2, 3};

  2.数组在方法中的传递

public static void main(String[] args) {
  int x = 1;
  int[] y = new int[10];
  m(x,y);   syso(
"x is " + x);   syso("y[0] is" + y[0]); } public void m(int number, int[] numbers) {   number = 10;   numbers[0] = 10; }
//output:
x is 1
y[0] is 10

    这是因为:
      对于基本数据类型参数,传递的是实参的值
      对于数组类型参数,参数值是数组的引用,给方法传递的是这个引用

  3.查询
    线性查询与二分查询

package Test;

public class Test2 {
    /**
     * 二分查找:
     *     使用二分查找法的前提条件是数组中的元素必须已经排好序
     *  二分查找法首先将关键字与数组的中间元素进行比较,有下面3种情况
         *  1.如果关键字小于中间元素,只需要在数组的前一半元素中继续查找
         *  2.如果关键字大于中间元素,只需要在数组的后一半元素中继续查找
         *  3.如果关键字与中间元素相等,那么就找到了,查找结束
     *  如一个有1024(2^10)个元素的数组,最好情况下只需要比较11次,最坏情况下要比较1023次
     */
    
    public static void main(String[] args) {
        int[] list = {1, 4, 4, 2, 5, -3, 6, 2};
        int i = lineraSearch(list, 4);
        System.out.println(i);
        int j = lineraSearch(list, -4);
        System.out.println(j);
        int k = lineraSearch(list, -3);
        System.out.println(k);
        
        int[] list1 = {2, 4, 7, 10, 11, 45, 50, 59, 60, 66, 69, 70, 79};
        int i1 = binarySearch(list1, 2);
        System.out.println(i1);
        int j1 = binarySearch(list1, 11);
        System.out.println(j1);
        int k1 = binarySearch(list1, 79);
        System.out.println(k1);
        
        //output:
        /*
           1
          -1
           5
           0
           4
          12
         */
    }
    
    /**
     * 线性查找法——最简单、最low
     * @param list
     * @param key
     * @return
     */
    public static int lineraSearch(int[] list, int key) {
        for (int i = 0; i < list.length; i++) {
            if (key == list[i]){
                return i;
            }
        }
        return -1;
    }
    
    /**
     * 二分查找法
     * @param list
     * @param key
     * @return
     */
    public static int binarySearch(int[] list, int key) {
        int low = 0;
        int high = list.length - 1;
        while (high >= low) {
            int mid = (high + low) / 2;
            if (key < list[mid]) {
                high = mid - 1;
            } else if (key == list[mid]) {
                return mid;
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }

}

  4.排序
    选择排序

 1 /*
 2      * 选择排序
 3      *     1.选择排序法先找到数列中最小的数
 4      *     2.然后将它放在数列的最前面
 5      *     3.在剩下的数中,循环1、2操作
 6      */
 7     public static void selectionSort(int[] array) {
 8         for (int i = 0; i < array.length - 1; i++) {
 9             int minValue = array[i];
10             int minIndex = i;
11             for (int j = i + 1;j < array.length;j++) {
12                 if (array[j] < minValue) {
13                     minValue = array[j];
14                     minIndex = j;
15                 }
16             }
17             if (minIndex != i) {
18                 array[minIndex] = array[i];
19                 array[i] = minValue;
20             }
21         }
22     }

    插入排序

 1 /*
 2      * 插入排序
 3      *     1.外层循环(循环控制变量i)的迭代是为了获取已排好序的子数列
 4      *     2.内层循环(循环控制变量k)将list[i]插入到从list[0]到list[i-1]的子数列中
 5      */
 6     public static void insertionSort(int[] array) {
 7         for (int i = 1; i < array.length; i++) {
 8             int minValue = array[i];
 9             int k;
10             for (k = i - 1;k >= 0 && minValue < array[k]; k--) {
11                 array[k + 1] = array[k];
12             }
13             array[k + 1] = minValue;
14         }
15     }

    冒泡排序
    快速排序

原文地址:https://www.cnblogs.com/zhengbin/p/5380137.html