数组中的常见算法

1.数组的赋值

以杨辉三角为例:

package com.ashley.day_0607;

public class YangHuiTest {

	public static void main(String[] args) {
		int yangHui[][] = new int[10][];// 声明并初始化二维数组
		for (int i = 0; i < yangHui.length; i++) {
			yangHui[i] = new int[i + 1];// 给二维数组的各元素赋值,结果为0且第n行有n+1个元素
			yangHui[i][0] = yangHui[i][i] = 1;// 给二维数组每一行的首位元素赋值,结果为1
			if (i > 1) {
				for (int j = 1; j < yangHui[i].length - 1; j++) {
					yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];// 给二维数组的非首位元素赋值
				}

			}
		}
		for (int i = 0; i < yangHui.length; i++) {// 遍历二维数组
			for (int j = 0; j < yangHui[i].length; j++) {
				System.out.print(yangHui[i][j] + "\t");
			}
			System.out.println();
		}

	}

}
2.数组的赋值和复制的区别
  • 赋值:将arr1保存的地址值赋给了arr2,使得arr1和arr2共同指向堆空间中的同一个数组实体。
int[] arr1, arr2;//声明数组arr1,arr2
arr1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };//初始化arr1
for (int i = 0; i < arr1.length; i++) {//遍历arr1
	System.out.print(arr1[i] + "\t");
}
System.out.println();

arr2 = arr1;//将arr1赋值给arr2
  • 复制:给arr2在堆空间中新开辟一个数组空间,将arr1数组中的元素值一个一个的赋值到array2数组中。
int[] arr1, arr2;
arr1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };
for (int i = 0; i < arr1.length; i++) {
	System.out.print(arr1[i] + "\t");
}
System.out.println();

arr2=new int [arr1.length];
for (int i = 0; i < arr2.length; i++) {
	arr2[i]=arr1[i];//将arr1中的元素赋值到arr2数值中
}
3.数组元素的反转

方法一:

String[] arr = new String[] { "aa", "bb", "cc", "dd", "ee" };//反转后得到:ee,dd,cc,bb,aa
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;
}

方法二:

String[] arr = new String[] { "aa", "bb", "cc", "dd", "ee" };
for(int i = 0,j = arr.length - 1;i < j;i++,j--){
	String temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}
4.数组元素的查找
  • 顺序查找:从数组的一端开始,逐个进行比较,直到找到目标元素为止。
String arr1[] = new String[] { "春节", "元宵节", "儿童节", "国庆节" };
String dest1 = "儿童节";//确定查找的目标元素
for (int i = 0; i < arr1.length; i++) {
	if (dest1.equals(arr1[i])) {//判断目标元素的内容是否与arr1[i]的内容相等
		System.out.println("找到了指定元素,其位置为:" + i);
		isFlag = false;
		break;
	}
}
if (isFlag) {
	System.out.println("没有找到指定元素!");
}
  • 二分查找:采用折半的方式,将目标值与中间值进行比较;要求数组中的数据必须是有序的。
int arr[] = new int[] { -5, 12, 34, 78, 99, 127, 564, 682, 998 };
int dest = 34;//确定目标值
int head = 0;//初始的首索引
int end = arr.length - 1;//初始的尾索引
boolean isFlag = true;
while (head <= end) {
	int mid = (head + end) / 2;//定义中间值
	if (dest == arr[mid]) {//判断中间值是否与目标值相等
		System.out.println("找到了指定元素,其位置为:" + mid);
		isFlag = false;
		break;
	} else if (dest < arr[mid]) {
	end = mid - 1;//更改尾索引
	} else {
	head = mid + 1;//更改首索引
	}
}
if (isFlag) {
	System.out.println("没有找到指定元素!");
}
5.数组元素的排序

衡量排序算法的优劣标准:时间复杂度、空间复杂度、算法的稳定性。
重点掌握:

  • 冒泡排序:是一种简单的交换排序的方法,它通过两两比较相邻的数据,如果发生逆序,则进行交换,从而使小的数据向左移,大的向右移。
int arr[] = new int[] { -47, 32, 41, -18, 0, 16, 87, 133, 22, -1 };
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;
		}
	}
}

快速排序:由冒泡排序改进而得到的。它是在待排序的n个记录中,通常取第一个记录作为“基准”。通过一趟排序后,将所有小于基准的记录放到其左边,大于的放在其右边。然后重复上述过程(递归)将左右两边的记录进行排序,直至各剩一个记录。

发布了49 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ashleyjun/article/details/96180388