数组相关二(复制,查找,排序算法)

数组的复制,反转,查找

String[] arr = new String[]{"AA","BB","CC","DD","FF"};

//数组的复制
String[] arr1 = new String[arr.length];
for(int i = 0; i < arr1.length; i++){
    arr1[i] = arr[i];
}
//注意,数组变量的赋值  arr1 = arr;  同一个地址值,指向同一个数组实体;

//数组的反转
1.for(int  i = 0; i < arr.length / 2; i++){
    String temp = arr[i];
    arr[i] = arr[arr.length - 1 - i];
    arr[arr.length - 1 - i] = temp;
}
2.for(int i = 0,j = arr.length - 1; i < j; i++, j-- ){
    String temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

数组的查找

线性查找

又称顺序查找,效率低,数据特多的情况不建议使用。从数组第一个元素开始一一遍历数组,找到当前被遍历的值与所查找的值相同的过程。

String dest = "BB";
boolean isFlag = true;
for(int i = 0; i < arr.length; i++){
    if(dest.equals(arr[i])){
        System.out.println("找到了指定的元素,位置为: " + i);
        isFlag = false;
        break;
    }
    
}
if(isFlag){
 System.out.println("没找到指定的元素");
}

二分法查找

二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。

思路如下:

1:首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。

2:如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤1的操作。

3:如果某一步数组为空,则表示找不到目标元素。

//前提:所要查找的数组必须有序
int[] arr = new int[]{2,7, 18,36, 45,67,89};
int dest = 45;
int head = 0;  //初始的首索引
int end  = arr.length - 1; //初始的末索引
boolean isFlag = true;

while(head <= end){
    int middle = (head + end) / 2;
    if(dest == arr[middle]){
 		System.out.println("找到了指定的元素,位置为: " + middle);
        isFlag = false;
        break;
    }else if(arr[middle] > dest){
        end = middle - 1;
    }else{
        head = middle + 1;
    }
}
if(isFlag){
 System.out.println("没找到指定的元素");
}

数组元素的排序算法

冒泡排序

35 28 77 5 16

第1趟:

0 第1次 28 35 77 5 16

1 2 28 35 77 5 16

2 3 28 35 5 77 16

3 4 28 35 5 16 77

第2趟:

0 第1次 28 35 5 16 77

1 2 28 5 35 16 77

2 3 28 5 16 35 77

第3趟:

0 第1次 5 28 16 35 77

1 2 5 16 28 35 77

第4趟:

0 第1次 5 16 28 35 77

5个元素比较4趟,n个元素比较n - 1趟。

​ 趟数 次数

0 1 4

1 2 3

2 3 2

3 4 1

N个元素要排序完成,总共进行N-1趟排序,每i趟的排序次数为N-i.

外层循环控制趟数,内层循环控制每趟比较次数。

for(int i = 0; i < arr.length - 1; i++){
    for(int j = 0; j < arr.length - 1 - i; j++){
        if(arr[j] > arr[j + 1]){
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}

快速排序

快速排序是对冒泡排序的一种改进。

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
在这里插入图片描述

对数组中的数进行排序,随机找个基准数(用来参照的数),为了方便,可以拿第一个数作为基准数。接下来,需要将序列中所有比基准数大的放在其右边,比基准数小的放在其左边。定义两个指针。

基准数后的元素定义为指针low,末尾的定义为high。low不断向右走,high向左走,要求low指向的元素值要比基准值小,high指向元素值比基准值要大,满足的话,接着下一步。直到当low出现比基准数大,high出现比基准数小的情况,将两者元素对调。接 着进行,若还出现这情况的话,接着进行对调

若high< low,结束查找。若high对应元素比基准数小,则与基准数进行对调。

经过一轮排序后,将数组分成两部分,接着分别在这两块进行上述操作,设置基准数,low,high等。

各种内部排序算法,从平均时间而言, 快序最佳。

Arrays工具类使用

java.util.Arrays:操作数组的工具类,内部定义了很多操作数组的方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将指定值填充到数组当中,是将每个元素替换成指定元素。
二分查找元素位置,没找到的话,索引值为负数。

另外,还有数组元素的赋值
数值型数组中元素的最大值,最小值,平均数等

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值