数组介绍及常用算法的 java 实现

数组是多个相同类型数据的组合,实现对这些数据的统一管理 。

数组的初始化:
一维数组: int[] a = new int[10];
二维数组: int[][] b = new int[3][4]; 或 int[][] b = new int[3][];

其中每个一维数组的长度是可变的
b[0] = new int[3];
b[1] = new int[4];
b[2] = new int[5];

数组一旦初始化,长度不可变 。

数组元素的默认初始化:
对于基本数据类型而言,默认初始化各有不同 。
对于引用类型而言,默认初始化为 null 。

注意特殊写法:int[]x,y[]; x 是一维数组 y 是二维数组 。

数组的介绍比较简单,主要看一下,对数组的增删改查和排序 。

在为数组添加数据时,我们可以实现有序数组 。
实现:

/**
     * 添加数据 (实现有序排列 从小到大)
     *
     * 原理:来一个数据,去找到比它大的,记录位置 index,然后将index 及其后面的所有元素后移一位
     * @param value
     * @return
     */
    public void insert(int value){
        int i;
        for(i = 0; i < elements;i ++){
            if(arr[i] > value){
                break;
            }
        }
        for(int j = elements ;j > i; j --){
            arr[j] = arr[j - 1];
        }
        arr[i] = value;
        elements ++;
    }
//elements 为数组的有效长度

所以说,有序数组的插入是比较慢的,因为要进行比较 。

在删除数组元素的时候,其实是从删除位置的后一位开始依次向前覆盖 。 这样最终的效果就是指定位置的元素被删除了 。

// index 为要删除的数据的索引
 for (int i = index ; i < arr.length; i ++){
            arr[index] = arr[index + 1];
        }

数组的修改直接把指定位置的数据修改即可 。

数组的查找直接给定索引值即可查找 。或是给定元素,遍历数组查找(较慢) 。有没有什么提高效率的算法呢 ?

我们可以使用二分法查找 。
具体实现:

/**
     * 使用二分法查找
     *
     * 原理:前提是有序数组。每次都是和中间的数据做比较。
     * 若大于中间的数,则与四分之三处的元素比较。
     * 若小于中间的数,则与四分之一处的元素比较。
     * 以此类推
     * @param vlaue
     * @return
     */
    public int binarySearch(int vlaue){
        int middle = 0;
        int low = 0;
        int pow = arr.length;

        while (true){
            middle = (low + pow) / 2 ;
            if(arr[middle] == vlaue){
                return middle;
            }else if (low > pow){
                return -1;
            }else{
                if(arr[middle] > vlaue){
                    pow = middle - 1;
                }else{
                    low = middle + 1;
                }
            }
        }
    }

数组的简单排序算法原理及实现 。

1 冒泡排序

 /**
     * 简单排序之 冒泡排序
     *
     * 原理:用最后一个和前一个进行比较,
     * 若是小于 则进行交换,依次进行,这样经过一轮,最小的数就在最上面了。
     * @param arr 需要排序的数组
     */
    public static void bubbleSort(int[] arr){
        int temp = 0;
        for (int i = 0;i < arr.length - 1; i++ ){
            for (int j = arr.length - 1;j > i; j --){
                if(arr[j] < arr[j -1]){
                    temp = arr[j];
                    arr[j] = arr[j-1];
                    arr[j-1] = temp;
                }
            }
        }
    }

2 选择排序

/**
     * 简单排序之 选择排序
     *
     * 原理:用一个指针 k 索引,和k之后的数据进行比较,若是小于k的话,就将K指向它,
     * 最后用 i 记录最小的那个数。
     *
     * @param arr
     */
    public static void selectionSort(int[] arr){
        int temp = 0;
        for (int i = 0;i < arr.length - 1;i ++){
            int k = i;
            for (int j = i;j < arr.length;j ++){
                if(arr[j] < arr[k]){
                    k = j;
                }
            }
            if( i != k){
                temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;
            }
        }
    }

3 插入排序

/**
     * 简单排序之 插入排序
     *
     * 原理:使用 i 遍历数组,从第二个数开始,将 i 指向的值放入temp中,使用 j 去遍历,i 前面的数,
     * 判断,当 j 指向的值大于temp时,也就是 i 时,要将j的值赋给 i ,依次向左,
     * 最终将将 temp 的值放入不满足条件的地方(即左边的值小于temp时)。
     *
     * @param arr
     */
    public static void insertSort(int[] arr){
        for (int i = 1;i < arr.length; i++){
            int temp = arr[i];
            int j = i -1;
            while (j >= 0 && arr[j] >= temp){
                arr[j+1] = arr[j];
                j --;
            }
            arr[j+1] = temp;
        }
    }

java 能动态分配数组吗?
答:可以 。int i = 12;int[] myInt = new int[i];


我怎么知道数组的长度?
.length 属性获取


数组有没有 length() 这个方法 ? String 有没有 length() 这个方法
答:数组没有 length() 这个方法,有 length 的属性。String 有 length() 这个方法


Java 中的任何数据类型都可以使用 System.out.pritln 方法显示。
对基本数据类型而言,输出的往往是变量的值;
对于像数组这一类复杂的数据类型,输出的是引用,有些不是引用,那是因为重新了 toString( ) 方法 。


String[] stringArray = new String[3]; // 各元素的值默认为null
for (int i = 0; i < stringArray.length; i++) { // 对各元素进行初始化,但没有赋值。
stringArray[i] = new String();
System.out.println(stringArray[i]);
}
空 (有别于 null)


操作二维数组不应使用常数来控制维数 。具体方法是 array.length 表示行数,array[row].length 来表示 row 行的列数 。这样当数组行数和列数不相等时,代码可以自动调整为正确的值 。


下面数组定义正确的有_
A.String strs[] = { ‘a’ ‘b’ ‘c’};
B.String[] strs = {“a”, “b”, “c”};
C.String[] strs = new String{“a” ”b” ”c”};
D.String strs[] = new String[]{“a”, “b”, “c”};
E.String[] strs = new String[3]{“a”, “b”, “c”};

B、D


//输入任意一个人的年龄,就可以判断出他是哪个年龄段的人?

/*
0-9 儿童
10-19 少年
20-29 青少年
30-39 青年
40-49 壮年
50-59 中年
60-69 中老年
70-79 老年
80-89 老老年
90-99 老老老年
*/
应用数据结构的思想
int age = 22;
String[] arr = {“儿童”,”少年”,”青少年”,”青年”,”壮年”,”中年”,”“,”“,”“,”“};
int idx = age/10;
System.out.println(arr[idx])


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值