zoukankan      html  css  js  c++  java
  • 一天一个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     }

        冒泡排序
        快速排序

  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/zhengbin/p/5380137.html
Copyright © 2011-2022 走看看