Java中数组常见算法代码总结

本文详细介绍了数组在Java中的概念、创建方式,以及一维数组的排序(冒泡排序、选择排序、二分查找),查找目标值(无序和有序),数组乱序和旋转的方法。这些内容展示了数组作为基础数据结构的重要性和操作技巧。
摘要由CSDN通过智能技术生成

数组基础知识;

什么是数组:

        数组是一种线性数据结构,是一个使用连续的内存空间存放相同的数据类型的集合容器,与其他容器相比,数组的区别主要在于性能与保存基本类型的能力。

        在Java中,数组是一种效率最高的存储和随机访问对象的方式,但是为了保持空间的连续性,在数组中插入、删除数据时,都需要移动后面数据。但是,由于数组是定长的,一旦声明之后就不可以改变长度,所以如果长度声明过大或者过小都会造成问题。

一维数组的几种创建方式

元素类型[] 数组名 = new 元素类型[元素个数或数组长度];

元素类型[] 数组名 = new 元素类型[]{元素,元素,……};

元素类型[] 数组名 = {元素,元素,……};

数组的常用算法代码总结

1.数组排序:

        通过方法进行排序,通过Arrays.sort()方法可直接进行排序,但其只能将数组排列为升序数组

int[] array = new int[]{1,3,4,8,2,7,5,6,10};
		Arrays.sort(array);

        通过冒泡排序进行排序

        基本思想:

用数组的第一个元素和第二个元素进行比较,将大的放到后面。然后用第二个和第三个比较,大的放后面,以此类推,直到最后一个元素,这个过程称为一轮。在一轮结束后,最大的元素已经放在最后一位了,然后开始第二趟,第二趟结束后第二大的元素就被放到倒数第二个位置,就这样持续直到所有元素有序为止(最后一个元素不用比较,所以轮数为数组长度-1)

int[] array = new int[]{1,3,4,8,2,7,5,6,10};
		
		for(int i=0;i<array.length-1;i++) {//控制循环的轮数,该数组有9个数,即只需要比较8轮

			for(int k=0;k<array.length-i-1;k++) {//控制比较后的,交换的次数
				if(array[k]>array[k+1]) {  //决定排列后的数组为升序(当k位置的数大于k+1位置的时候交换)或降序状态:
					//通过不断异或交换位置,也可使用中间变量
					array[k] = array[k] ^ array[k+1];
					array[k+1] = array[k] ^ array[k+1];
					array[k] = array[k] ^ array[k+1];
				}
				
			}
		}

选择排序

基本思想:与冒泡排序相似,通过每次从头至尾取一个数,找最大的,依次排序

int[] array = new int[]{1,3,4,8,2,7,5,6,10};
		
		for(int i=0;i<array.length-1;i++) {
			for(int k=i+1;k<array.length;k++) {
				if(array[i]>array[k]) {
					int temp = array[i];
					array[i] = array[k];
					array[k] = temp;
				}
			}
		}

还有插入排序,快速排序等

2.无序数组查找目标值:

        因为数组是无序的所以,只能从头部或者尾部,或者双指针(头部和尾部)逐个匹配,当与目标值相等时,即输出其下标

        从头查找

int[] array = new int[]{1,3,4,8,2,7,5,6,10};
		int target = 5;
		for(int i=0;i<array.length;i++) {
			if(array[i]==target) {
				System.out.println("目标值在该数组的下标为:"+i);
				break;
			}
		}

        从尾查找


		int[] array = new int[]{1,3,4,8,2,7,5,6,10};
		int target = 5;
		for(int i=array.length-1;i>=0;i--) {
			if(array[i]==target) {
				System.out.println("目标值在该数组的下标为:"+i);
				break;
			}
		}

        双指针查找

int[] array = new int[]{1,3,4,8,2,7,5,6,10};
		int target = 5;
		for(int i=array.length-1,k=0;i>=k;i--,k++) {
			if(array[i]==target) {
				System.out.println("目标值在该数组的下标为:"+i);
				break;
			}
			if(array[k]==target) {
				System.out.println("目标值在该数组的下标为:"+i);
				break;
			}
		}

3.有序数组查找

通过Arrays.binarySearch()方法直接可返回目标值在数组中的下标,

若未查找到,则返回一个小于0的负整数

int[] array = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 10};
		int target = 5;
		Arrays.binarySearch(array, target);

        手写二分查找

int[] array = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 10};
		int target = 5;
		int low=0,high=array.length-1;
		while(low<=high) {
			int mid = (low+high)>>1;//相当于折半或除2
			if(target==array[mid]) {
				System.out.println(mid);
				break;
			}else if(array[mid]>target){
				high=mid-1;
			}else {
				low=mid+1;
			}
		}

4.数组乱序

        通过产生随机下标与当前位置的数值交换乱序

int[] array = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 10};
		for(int i=array.length-1;i>0;i--) {
			int index= (int) (Math.random()*i);
			array[i] = array[i] ^ array[index];
			array[index] = array[i] ^ array[index];
			array[i] = array[i] ^ array[index];
		}

5.数组旋转

左旋:

	int[] array = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 10};
		for(int i=0;i<3;i++) {  //控制旋转次数
			
			for(int k=0;k<array.length-1;k++) {//一次旋转需交换的次数
				//通过不断交换,移动位置
				array[k] = array[k] ^ array[k+1];
				array[k+1] = array[k] ^ array[k+1];
				array[k] = array[k] ^ array[k+1];
			}
		}

右旋:

	int[] array = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 10};
		for(int i=0;i<3;i++) {  //控制旋转次数
			
			for(int k=array.length-1;k>0;k--) {//一次旋转需交换的次数
				//通过不断交换,移动位置
				array[k] = array[k] ^ array[k-1];
				array[k-1] = array[k] ^ array[k-1];
				array[k] = array[k] ^ array[k-1];
			}
		}

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cph_507

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值