数组常见算法

一、数组排序

冒泡排序

        本篇我们介绍最基本的排序方法:冒泡排序。

实现步骤

1、比较两个相邻元素,如果第一个比第二个大,就交换位置

2、对每一对相邻元素进行同样的操作,除了最后一个元素

特点

每一轮循环后都会把最大的一个数交换到末尾,因此下一轮就可以忽略最后的数。

总共比较n-1轮,每轮比较n-1-i次

代码实现

//无序数组
int[] number1= {8,9,7,4,3};
//int[] number1= {1,2,3,4,6};//有序数组 比较次数为:4
System.out.println("排序前"+Arrays.toString(number1));
int count=0;
for(int i=0;n=number1.length();i++){
    boolean isSorted=true;
    for(int k=0;k<n-1-i;k++){
        count++;
        //如果发生元素的交换则代表源数组无序
        if(number1[k]>number1[k+1]){
            number1[k]=number1[k]^number1[k+1];
            number1[k+1]=number1[k]^number1[k+1];    
            number1[k]=number1[k]^number1[k+1];
            isSorted=false;
        }
    }
    //若没有发生元素的交换则说明数组已经有序,则跳出循环,但至少比较一次
    if(isSorted){
        break;
    }
}
System.out.println("比较次数为:"+count);
System.out.println("排序后"+Arrays.toString(number1));

输出结果:

排序前[8, 9, 7, 4, 3]
比较次数为:10
排序后[3, 4, 7, 8, 9] 

 使用Arrays工具类排序

        实际上,Java的标准库已经内置了排序功能,我们只需要调用Arrays.sort()方法就可以实现快速排序:

int ns={3,6,1,8,2,9};
//排序前
System.out.println("排序前:"Arrays.toString(ns));
//排序
ns.sort();
//排序后
System.out.println("排序后:"Arrays.toString(ns));

输出结果:

排序前:[3,6,1,8,2,9]

 排序后:[1,2,3,6,8,9]

二、无序数组查找

        在一个无序数组中,如果需要进行指定元素的查找,可以通过循环遍历或Arrays工具类两种方式进行查找。

遍历查找

        我们可以通过对无序数组进行遍历,将数组中的每一个元素与目标元素进行比较,从而确定该数组中是否包含该目标数组:

整型数组

int[] array= {2,3,1,56,72,19,2,5,1};
int index=-1;
//查找元素第一次出现的位置
try(Scanner input=new Scanner(System.in)){
    System.out.println("请输入要查找的元素");
    int target=input.nextInt();
    //案例1:查找在无序数组中目标元素第一次出现的位置
    for(int i=0;i<array.length;i++){
        if(array[i]==target){
            index=i;
            System.out.println("%d第一次出现的位置是%d",target,index);
            break;
        }
    }
    System.out.println();
    index=-1;
    //案例2:查找在无序数组中目标元素最后一次出现的位置
    for(int i=array.length-1;i>=0;i--){
        if(array[i]==target) {
			index=i;
            System.out.printf("%d最后一次出现的位置是%d",target,index);
			break;
		 }
    }

输出:请输入要查找的元素
输入:1

输出:
1第一次出现的位置是2
1最后一次出现的位置是8

字符串数组

String[] singerArray = { "李荣浩", "盘尼西林", "王菲", "王贰浪", "鹿先森乐            
                    队","孙燕姿", "G.E.M.邓紫棋", "方大同", "品冠儿子" };
	int count=0;
	int index=-1;
	System.out.println("请输入你要查找的歌手:");
	try(Scanner input=new Scanner(System.in)){
		String target=input.next();
		for(int i=0;i<singerArray.length;i++) {
			count++;
			//String字符串的等值比较,必须用equals方法
			if(singerArray[i].equals(target)) {
				index=i;
				break;
			}	
		}
	System.out.printf("%s的位置在%d,查找了%d次",target,index,count);
	}

输出:请输入你要查找的歌手:
输入:孙燕姿
输出:孙燕姿的位置在5,查找了6次 

双指针遍历查找--字符串数组

String[] singerArray = { "李荣浩", "盘尼西林", "王菲", "王贰浪", "鹿先森乐        
                    队","孙燕姿", "G.E.M.邓紫棋", "方大同", "品冠儿子" };
int count=0;
int index=-1;
try(Scanner input=new Scanner(System.in)){
	System.out.println("请输入你要查找的歌手:");
	String target=input.next();	
    for(int i=0,k=singerArray.length-1;i<=k;i++,k--) {
        count++;
        //从头开始比较
        if(singerArray[i].equals(target)){
            index=i;
            break;
        }
        //从尾部开始比较
        if(singerArray[k].equals(target)){
            index=k;
            break;
        }
    }
System.out.printf("%s的位置在%d,查找了%d次",target,index,count);
}

 输出:请输入你要查找的歌手:
输入:孙燕姿
 输出:孙燕姿的位置在5,查找了4次

双指针的查找次数少,效率更高

三、有序数组查找

二分查找

作用

        在一个有序数组中,如果需要进行指定元素的查找,可以采用二分查找(binarySearch),这样会比通过遍历数组来进行查找的效率高很多。以下是二分查找的代码实现:

int[] num={1,3,5,7,8};
int target=3;
int index=-1;
//数组的首元素和尾元素
int low=0,high=num.length-1;

while(low<=high){
    int mid=(low+high)/2;
    //判断mid是否等于target
    if(num[mid]==target){
        index=mid;//如果等于代表查找成功,则循环退出
        break;
    }else if(num[mid]>target){//此时代表目标元素可能在mid的左半区
        hight=mid-1;
    }else if(num[mid]<target){//此时代表目标元素可能在mid的右半区
        low=mid+1;
    }
}
System.out.printf("%d的位置为%d",target,index);

输出结果:3的位置为1 

Arrays工具类查找

        在Java的标准库中也为我们内置了二分查找,可以直接通过调用Arrays.binarySearch()的方法进行查找:由于该方法基于二分查找,所以进行排序的数组必须是有序的,所以我们可以先使用Arrays.sort()进行排序,再调用Arrays.binarySearch()进行查找

int[] array={28,12,89,73};
int target=12;
//先排序
Arrays.sort(array);
//在查找
int index=Arrays.binarySearch(array,target);

System.out.println("%s的位置在%d",target,index)

输出结果:12的位置在1  

四、数组乱序

算法简述

         题目:将一个数组中所有元素的顺序都打乱。

        那不是直接用Math.random()*100重复50次不就好了吗?不,Math.random()的重复概率很大,不能保证50个数字每个都不同,所以我们为大家介绍一种算法:乱序算法

实现步骤

①假设有一个等待乱序的数组P

②从P中随机选取一个未乱序的元素

③将该元素与数组P中最后一个元素交换

④重复2、3两个步骤直到数组P中所有元素全部完成排序

代码实现

int[] number= {11,12,13,14,15,16,17};
System.out.println("乱序前:"+Arrays.toString(number));
for(int i=number.length-1;i>0;i--){
    //产生随机下标
    int randomIndex=(int)(Math.random()*i);
    //交换元素
    number[i]=number[i]^number[randomindex];
	number[randomindex]=number[i]^number[randomindex];
	number[i]=number[i]^number[randomindex];
}
System.out.println("乱序后:"+Arrays.toString(number));
    

输出结果:

乱序前:[11, 12, 13, 14, 15, 16, 17]
乱序后:[12, 16, 17, 15, 11, 13, 14]

应用

题目:产生7个不重复的1-33的数字

int[] num=new int[33];
for(int i=0;i<num.length;i++){
    num[i]=i+1;
}
System.out.println("乱序前:"+Arrays.toString(number));
//先乱序
for(int i=num.length;i>0;i--){
    int randindex=(int)(Math.random()*i);
    num[i]=num[randindex]^num[i];
    num[randindex]=num[randindex]^num[i];
    num[i]=num[randindex]^num[i];
}
//存前7个
int[] n=new int[7];
System.arraycopy(num,0,n,0,n.length);
System.out.println("乱序后:"+Arrays.toString(number));

输出结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]
[21, 12, 8, 26, 16, 5, 25]
 

五、数组旋转

算法描述

数组向右旋转3位:将尾元素通过不断旋转,交换到头部

数组向左旋转三位:将头元素通过不断旋转,交换到尾部

 

代码实现 

向右旋转

//遍历的顺序:从尾部开始
//交换的双方:k和k-1

int[] number= {1,2,3,4,5,6,7};
//向右旋转3次
//外层循环控制旋转次数,向右旋转3次
for(int i=0;i<3;i++){
    //内层循环控制旋转方向,每次向右旋转一位
    //遍历的顺序:从尾部开始
    //交换的双方:k和k-1
    for(int k=number.length;k>0;k--){
        number[k]=number[k]^number[k-1];
		number[k-1]=number[k]^number[k-1];
		number[k]=number[k]^number[k-1];
    }
}
System.out.println("向右旋转3次:"+Arrays.toString(number));

 输出结果:向右旋转3次:[5, 6, 7, 1, 2, 3, 4]

向左旋转

//遍历的顺序:从头部开始
//交换的双方:k和k+1

int[] number= {1,2,3,4,5,6,7};
//外层循环控制旋转次数,向左旋转3次
for(int i=0;i<3;i++) {
//内层循环控制旋转方向,每次向左旋转一位
    for(int k=0;k<number.length-1;k++){
        number[k]=number[k]^number[k+1];
		number[k+1]=number[k]^number[k+1];
		number[k]=number[k]^number[k+1];  
    }
}
System.out.println("向左旋转3次:"+Arrays.toString(number));      

输出结果:向左旋转3次:[4, 5, 6, 7, 1, 2, 3]

写作不易,如果帮到了你就点赞收藏吧!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/434028.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024/3/6打卡最短编辑距离---线性DP

题目&#xff1a; 给定两个字符串 A 和 B&#xff0c;现在要将 A 经过若干操作变为 B&#xff0c;可进行的操作有&#xff1a; 删除–将字符串 A 中的某个字符删除。插入–在字符串 A 的某个位置插入某个字符。替换–将字符串 A 中的某个字符替换为另一个字符。 现在请你求出&a…

蓝桥杯练习题——前缀和

1.壁画 思路 1.求最坏情况下&#xff0c;画的墙总和是多少 2.画的墙在中间连续一段&#xff0c;画了的墙长度是 n / 2 向上取整 3.取最大的 n / 2 向上取整区间和 #include<iostream> using namespace std; const int N 5e6 10; char s[N]; int a[N]; int t, n;int m…

重磅:2024广州国际酒店工程照明展览会

2024广州国际酒店工程照明展览会 Guangzhou international hotel engineering lighting exhibition 2024 时间&#xff1a;2024年12月19-21日 地点&#xff1a;广州.中国进出口商品交易会展馆 承办单位&#xff1a;广州佛兴英耀展览服务有限公司 上海昶文展览服务有限公司…

【详识C语言】自定义类型之二:枚举

本章重点 枚举 枚举类型的定义 枚举的优点 枚举的使用 枚举 枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中&#xff1a; 一周的星期一到星期日是有限的7天&#xff0c;可以一一列举。 性别有&#xff1a;男、女、保密&#xff0c;也可以一一列举。…

【深度学习笔记】5_8 网络中的网络NiN

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.8 网络中的网络&#xff08;NiN&#xff09; 前几节介绍的LeNet、AlexNet和VGG在设计上的共同之处是&#xff1a;先以由卷积层构成的…

Vue.js+SpringBoot开发森林火灾预警系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟雾传感器模块2.4 温度传感器模块2.5 历史记录模块2.6 园区数据模块 三、系统设计3.1 用例设计3.1.1 森林园区基础系统用例设计3.1.2 森林预警数据用例设计 3.2 数据库设计3.2.1 烟雾…

[PyQt5]PyQt5连接MYSQL时显示Driver not loaded解决方案

在第一次用PyQt5的 QSqlDatabase.addDatabase 连接mysql的时候&#xff0c;可能会出现Driver not loaded的情况&#xff0c;如下&#xff1a; from PyQt5.QtSql import QSqlQuery, QSqlDatabase from PyQt5.QtWidgets import QApplication import sysapp QApplication(sys.ar…

2024.3.6

#include<myhead.h>int do_add(sqlite3* ppDb) {int numb;char name[10];int salary;printf("请输入员工的信息&#xff1a;");scanf("%d %s %d",&numb, name, &salary);//将员工的信息存储到数组char sql_add[128] "";sprintf(s…

【K哥爬虫普法】二十五岁 人大本硕 腾讯在职 爬虫被捕!

我国目前并未出台专门针对网络爬虫技术的法律规范&#xff0c;但在司法实践中&#xff0c;相关判决已屡见不鲜&#xff0c;K 哥特设了“K哥爬虫普法”专栏&#xff0c;本栏目通过对真实案例的分析&#xff0c;旨在提高广大爬虫工程师的法律意识&#xff0c;知晓如何合法合规利用…

你知道katalon studio 如何完成 get/post 请求发送吗?

katalon studio作为目前最火的自动化测试工具之一&#xff0c;不仅仅只能完成webUI自动化&#xff0c;更是能完成api、app以及桌面应用程序的自动化测试。 本文将讲解一下katalon studio是如果完成接口测试的。 请求发送 get请求 1、先在object repository里new一个请求 2、…

CSS盒子模型笔记

尚硅谷学习视频链接&#xff1a;117_CSS_盒子模型的组成部分_哔哩哔哩_bilibili 1、盒子组成 盒子组成 content内容 padding border &#xff08;margin不包含在盒子内&#xff09; 2、div样式width、height 当css3属性box-sizingcontent-box&#xff08;默认&#xff0…

64位Office API声明语句第116讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

逻辑代数基础(二)(卡诺图)

目录 逻辑图表示 卡诺图表示 卡诺图的标准格式 二变量卡诺图 三变量卡诺图 四变量卡诺图 卡诺图表示逻辑函数 从逻辑表达式到卡诺图 逻辑代数的三个规则 代入规则 反演规则 对偶规则 逻辑函数的化简方式 化简逻辑函数的意义 逻辑函数最简表示式的判别标准 公式化简法 并…

【Software Platform Bundle】

https://www.ni.com/zh-cn/support/downloads/software-products/download.software-platform-bundle.html

【python】六个常见爬虫案例【附源码】

大家好&#xff0c;我是博主英杰&#xff0c;整理了几个常见的爬虫案例&#xff0c;分享给大家&#xff0c;适合小白学习 一、爬取豆瓣电影排行榜Top250存储到Excel文件 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序&a…

linux系统的进程管理

文章目录 前言一、系统的进程的运转方式1、系统时间&#xff1a;&#xff08;jiffies 系统滴答&#xff09;2、task_struct 二、如何创建一个新的进程&#xff08;重要&#xff09;三、进程调度①、主要函数②、辅助函数 四、进程的退出内核的销毁 前言 本文讲解系统的进程管理…

LeetCode142题:环形链表II(python3)

代码思路&#xff1a; 双指针的第一次相遇&#xff1a; 设两指针 fast&#xff0c;slow 指向链表头部 head 。 令 fast 每轮走 2 步&#xff0c;slow 每轮走 1 步。 fast 指针走过链表末端&#xff0c;说明链表无环&#xff0c;此时直接返回 null。 如果链表存在环&#xff0c;…

学习Java的第二天

如何使用文本文档在cmd里打印出HelloWorld 1、创建一个文本文档&#xff0c;并命名为HelloWorld&#xff0c;将后缀改为java&#xff08;需要自己去把后缀打开显示出来&#xff09; 2、打开编辑 也可以双击打开 3、在里面写出以下代码 上面红框里为你要打印的语句&#xff0c;…

Mybatis-Plus——05,乐观锁(新注解)

乐观锁&#xff08;新注解&#xff09; 一、数据库添加一个字段二、实体类添加version注解三、注册乐观锁插件四、测试一下4.1成功的乐观锁4.2失败的乐观锁————————创作不易&#xff0c;笔记不易&#xff0c;如觉不错&#xff0c;请三连&#xff0c;谢谢~~ 乐观锁实现方…

zabbix监控中间件服务

zabbix监控Nginx 自定义nginx访问量的监控项&#xff0c;首先要通过脚本将各种状态的值取出来&#xff0c;然后通过zabbix监控。找到自定义脚本上传到指定目录/etc/zabbix/script/ 在zbx-client客户端主机操作 #创建目录&#xff0c;然后将脚本上传到该目录mkdir /etc/zabbix/…