数组基础(排序)

目录

3.1数组

3.2数组元素的排序

3.3 数组元素的查找

3.4关键知识点默 


3.1数组

3.1.1数组概念

数组是保持固定数目的同一类型的值的容器对象。元素可以是基本类型或引用类型、通过下标来访问元素、长度固定(length)

数组中的每一项称为一个元素,每个元素都由其数字索引访问。如上图所示,编号从0开始。例如, 第9个元素将在索引8处访问。

3.1.2创建数组

由于数组的特殊性,所以创建数组(分配连续空间)需要采用特殊的语法,语法如下:

new 数据类型[长度]

示例:

package com.wxkj.yang;
​
public class Test02 {
    
    /**
     * 注意:数组长度一旦确定即不可改变
     * 属性:length 数组的长度
     * 
     * 数组的取值方式:数组的变量名称[元素索引位置]
     * 注意:元素索引从零开始,到长度减一位置,如果不在此范围,会造成下标越界异常
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
//      service();
        setElement();
    }
    public static void init(){
        //int[] ints = {10,20};
        
        int[] ints;
        ints = new int[5];
        //类型[]  数组名称      赋值   创建(新建)   类型[长度]
          int[]   ints1    =    new      int[5];
    }
    public static void service(){
        int[] ints = {10,12,45}; 
//      int hashCode = ints.hashCode();
//      System.out.println(hashCode);
//      int length = ints.length;
//      System.out.println(length);
        for(int i=0;i<ints.length;i++){
            int num = ints[i];
            System.out.print(num+" ");
        }
    }
    public static void setElement(){
//      int[] ints = {10,12,45}; 
//      ints[0] = 20;
//      System.out.println(ints[0]);
        int[] ints = {10,12,45}; 
        for(int i=0;i<ints.length;i++){
            ints[i] = 21+i;
            System.out.print(ints[i]+" ");
        }
    }
}

3.1.3数组元素的初始化

我们创建了一个数组(同类型的连续空间),并且通过一个引用型变量记录了数组的起始地址。然后 通过引用型变量中的地址就可以使用数组空间,语句如下:

引用型变量名[索引]

3.1.3数组变量声明、数组创建整合

实际使用时可以将数组变量声明、数组创建整合为一条语句。

:数组类型[] 数组变量名 = new 数组元素类型[5];

数组元素默认值:

整数型为0

浮点型为0.0

字符型为‘\u0000’(不同的系统平台显示结果不同)

布尔类型为false

引用类型为null

也可以创建数组时不指定长度,而使用元素值来取代

数组元素类型[] 数组名 = new 数组元素类型[]{元素0,元素1,....};

数组元素类型[] 数组名 = {元素0,元素1,....};

有几个元素值,数组长度就是几;而且元素默认值是此处给出的值

3.1.4. 数组的使用

  1. 通过下标访问指定元素

    Java语言的数组索引(下标、角标)是从0开始的,数组的下标的最大值长度-1(??)

    不要超出索引的范围,如果超出范围出现异常 ArrayIndexOutOfBoundsException

  2. 获取数组元素的个数 在Java中,所有数组都提供了一个length属性,通过这个属性可以访问到数组的长度

  3. 遍历数组 依次访问数组中的每一个元素,获取每个下标对应的元素值

简单for循环

public static void main(String[] args) {
    int[] ages = new int[5];
    //数据元素初始化
    for (int i = 0; i < ages.length; i++) {
        ages[i] = i;
    }
    //数据元素获取
    for (int i = 0; i < ages.length; i++) {
        System.out.println(ages[i]);
}

增强for循环(foreach)

public static void main(String[] args) {
    int[] ages = new int[5];
    //数据元素初始化,这是没用的,赋值的是age变量,不是数组元素
    for (int age: ages) {
        age=1;
    }
    //数据元素获取
    for (int age: ages) {
        System.out.println(age);
    }
}

增强for循环在部分计算机语言中使用的是foreach关键字,Java不支持foreach关键字

增强for循环还可以用来遍历集合元素(Iterable),后面章节学习

3.2数组元素的排序

  1. 数组排序的必要性

  • 在数组 A 中搜索特定值 v

  • 查找数组 A 中的最小或者最大值

  • 测试唯一性并删除数组中的重复元素

  • 计算特定值 v 在数组 中出现多少次

  • 获取两个排序数组之间的交集/并集

  1. 什么是算法

    计算的方法,解决问题的方案

3.2.1冒泡排序(Bubble Sort)

每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。

对一个有N个元素(如:5个元素)的数组进行冒泡排序的思路:

  1. 比较一对相邻元素(如:ages[0]、ages[1])

  2. 如果大小关系不符合规则(如规则:ages[0]<ages[1]),则交换数据

  3. 重复步骤1、2,直到数组末尾(最后比对的是ages[3]、ages[4])

  4. 重复步骤3,每次重复直到所有元素都以排序

 

 

package com.wxkj.yang;

public class Test04 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] nums = {2,5,4,8,6,1,3};
		int temp = 0;
		boolean flag = false;
		for(int i=0;i<nums.length;i++){
			for(int j=0;j<nums.length-1-i;j++){
				if(nums[j]>nums[j+1]){
					temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
					flag = true;
				}
			}
			if(!flag){
				break;
			}
		}
		for (int n : nums) {
			System.out.print(n+" ");
		}

	}

}

3.2.2插入排序(Insertion Sort)

将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是 数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将 其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。

实现思路: 类似于打扑克时,发牌完成后整理自己手中牌的路子,假定最左侧第一个是排好序的,然后从未 排序元素中取一个元素出来,按序插入到已排序的序列中。

  1. 初始数据 假设2是排好序的,也是已排序区间有一个元素

 

 

 

 

 

/**
	 * 插入排序法
	 * 在已经排好顺序的额数组中插入一个元素,数组依然保持原有排列方式
	 * 		1、查找要插入的元素在数组中应该存在位置
	 * 		2、创建新数组,长度为原数组长度加1
	 * 		3、将新元素应该存在位置及之后的元素向后移一个位置
	 * 		4、将新元素插入到其应该存在的位置
	 */
	public static void chaRu(){
		int[] nums = {5,20,14,17,15,82,2,54,1};
		Arrays.sort(nums);
//		for(int i=0;i<nums.length;i++){
//			System.out.print(nums[i]+" ");
//		}
		int[] nums1 = new int[nums.length+1];
		int newNum = 52;
		int index = 0;
		for(int i=0;i<nums.length;i++){
			nums1[i] = nums[i];
		}
		for(int i=0;i<nums1.length-1;i++){
			if(nums1[i]<=newNum&&newNum<=nums1[i+1]){
				index = i+1;
				int j=nums1.length-1;
				for(;j>index;j--){
						nums1[j] = nums1[j-1];
				}
				if(j==index+1){
					break;
				}
			}
		}
		nums1[index] = newNum;
		for (int i : nums1) {
			System.out.print(i+" ");
		}
	}

3.2.3选择排序(Selection sort)

第一次从待排序的数据中选择出最小的一个元素,存放在序列的起始位置,然后再从剩余的未排序元 素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为 零。

  1. 初始数据 假设所有数据都是未排序的

 

 

 

 

public static void xuanZhe(){
		int[] nums = {5,20,14,17,15,82,2,54,1};
		for(int i=0;i<nums.length;i++){
			for(int j=i;j<nums.length;j++){
				if(nums[i]>nums[j]){
					int temp = nums[i];
					nums[i] = nums[j];
					nums[j] = temp;
				}
			}
			System.out.print(nums[i]+" ");
		}
	}

3.2.4快速排序

只能升序排序

		int[] nums = {5,20,14,17,15,82,2,54,1};
		Arrays.sort(nums); 
// 逆序输出
        for(int i=nums.length-1;i>=0;i--){
            System.oout.print(nums[i]);
        }

3.3 数组元素的查找

3.3.1顺序查找

遍历整个数组,依次把每一位元素和要查找的数据进行比较

public static int chaZhao(int ints[]){
		int index = 0;
		int value = 10;
		boolean falg = false;
		for(int i=0;i<ints.length;i++){
			if(ints[i] == value){
				index = i;
				falg = true;
				break;
			}
		}
		if(falg == false){
			return ints.length+1;
		}
		return index;
	}

3.3.2二分法查找(Binary Search)

二分查找(Binary Search)算法,也叫折半查找算法。前提是数组是有序(升序或者降序)的,将 待查找的元素与中间下标对应的元素比较,如果大于中间下标对应的元素,则去右半部分查找。直到找 到要查找的元素,或者区间被缩小为0。

public static void erFenChaZhao(int[] ints,int num){
		Arrays.sort(ints);
		int low =0;
		int high = ints.length-1;
		while(low<=high){
			int mid = (low+high)/2;
			if(ints[mid] == num){
				System.out.print("结果为:"+mid);
				return;
			}else if(ints[mid]<num){
				low = mid+1;
			}else{
				high = mid-1;
			}
		}
		System.out.println("没找到");
	}

3.4关键知识点默 

  1. eclipse的基本使用

  2. 数组是保持固定数目的同一类型的值的容器对象

    1. 数组变量(属于引用型变量<对应于基本类型变量>),int[] arr或者int arr[]

    2. 创建数组,new int[5]

    3. 数组创建、数组变量声明整合

      1. int[] arr=new int[5];

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

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

  3. 数组的使用

    1. 通过下标访问元素,下标的范围0-长度-1,arr[0],数组元素有默认值

    2. 使用length属性获取数组的长度

    3. 遍历数组元素

      1. for

      2. 增强for

排序:冒泡排序、 插入排序、 选择排序

查找: 顺序查找 二分法查找

通过数组变量理解引用型变量 引用型变量放的是个地址,便于通过一个变量找到多个空间

常见面试题

  1. 基本数据类型和引用数据类型之间的区别?打印结果是什么?

  2. 在Java中,声明一个数组过程中,是如何分配内存的?

  3. 数组的定义方式?

  4. 说说你知道的数组排序算法? 写个冒泡算法?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值