携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第十二天,点击查看活动详情
数组中涉及的常见算法
第一题(杨辉三角)
二维数组写杨辉三角形(视频讲解链接)
题目要求
考点:二维数组的赋值和声明问题
难点:给0部分赋值
代码
package com.atguigu.exec;
public class ShuZusuanfa {
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];
//给每行的首末元素赋值1
yangHui[i][0]=1;
yangHui[i][i]=1;
//给每行的中间元素赋值
if(i>1){
for(int j = 1;j<yangHui[i].length-1;j++){
//任意元素等于其上的元素(a)与a左边元素的和(除了首尾)
yangHui[i][j]=yangHui[i-1][j-1]+yangHui[i-1][j];
}
}
}
//遍历二维数组
for(int i = 0;i<yangHui.length;i++){
for(int j = 0;j<yangHui[i].length;j++){
System.out.print(yangHui[i][j]+" ");
}
System.out.println();//每行完了换行
}
}
}
控制台:
第二题
题目要求
第三题
package com.atguigu.exec;
//生成随机的两位数[10 99]
//(int)(Math.random()*(99-10+1)+10)
public class ArrayTest {
public static void main(String[] args){
int[] arr = new int[10];
for(int i = 0;i<arr.length;i++){
arr[i]=(int)(Math.random()*(99-10+1)+10);
}
//最大值
int maxValue = arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]>arr[0]){
maxValue=arr[i];
}
}
//最小值
int minValue = arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]<arr[0]){
minValue=arr[i];
}
}
//总和
int sum = 0;
for(int i=0;i<arr.length;i++){
sum+=arr[i];
}
//平均数
int average = sum/arr.length;
}
}
第四题 数组的复制
package com.atguigu.exec;
public class Copy {
public static void main(String[] args){
int[] array1,array2;
array1 = new int[]{2,3,5,7,11,13,17,19};
for(int i = 0;i<array1.length;i++){
System.out.print(array1[i]+"\t"); //2 3 5 7 11 13 17 19
}
//把array1的值赋给array2
//不能称作数组的复制
array2 = array1;
for(int i=0;i<array2.length;i++){
if(i%2==0){
array2[i]=i;
}
}
System.out.println();
//再打印一下array1 0 3 2 7 4 13 6 19
for(int i = 0;i<array1.length;i++){
System.out.print(array1[i]+"\t");
}
}
}
//array2 = array1; 不能称作数组的复制
既然上面的不能实现数组的复制,怎么来实现一下数组的复制
package com.atguigu.exec;
public class Copy2 {
public static void main(String[] args){
int[] array1,array2;
array1 = new int[]{2,3,5,7,11,13,17,19};
for(int i = 0;i<array1.length;i++){
System.out.print(array1[i]+"\t"); //2 3 5 7 11 13 17 19
}
//把array1的值赋给array2
//不能称作数组的复制
// array2 = array1;
//实现数组的复制
array2=new int[array1.length];
for(int i=0;i<array1.length;i++){
array2[i]=array1[i];
}
for(int i=0;i<array2.length;i++){
if(i%2==0){
array2[i]=i;
}
}
System.out.println();
//再打印一下array1 2 3 5 7 11 13 17 19
for(int i = 0;i<array1.length;i++){
System.out.print(array1[i]+"\t");
}
}
}
这下 修改数组2的元素值就不会再影响数组1了
内存解析
第五题 线性查找和二分法查找
二分法查找原理
代码实现
//查找
//线性查找
String[] test = new String[]{"jj","dd","kk"};
String dest="jj" ;
Boolean isFlag = false;
for(int i=0;i<test.length;i++){
if(dest.equals(test[i])){
System.out.println("找到了,位置为"+i);
isFlag=true;
break;
}
}
if(isFlag==false){
System.out.println("没找到");
}
//二分法查找
//前提:所要查找的数组必须有序
int[] arr = new int[]{12,34,56,78,90,123,1234,12345};
int head = 0; //初始首索引
int last= arr.length-1; //初始末索引
Boolean isFlag1 = true;
int desti=123;
while(head<last){
int middle = (head+last)/2;
if(desti==arr[middle]){
isFlag1= false;
System.out.println("find,位置在"+middle);
break;
}else if(desti>arr[middle]){
head = middle+1;
}else{
last=middle-1;
}
}
if(isFlag1){
System.out.println("没找到");
}
第六题 数组反转
//数组的反转
String[] test = new String[]{"jj","dd","kk"};
//方法一
for(int i=0;i<test.length/2;i++){
String temp=test[i];
test[i]=test[test.length-i-1];
test[test.length-i-1]=temp;
}
//遍历(看看反转成功了吗
for(int i=0;i<test.length;i++){
System.out.print(test[i]);
}
//方法二
for(int i=0,j=test.length-1;i<j;i++,j--){
String temp = test[i];
test[i]=test[j];
test[j]=temp;
}
for(int i=0;i<test.length;i++){
System.out.println("*******");
System.out.print(test[i]+"\t");
}
第七题 排序算法
冒泡排序和快速排序都要会手写
堆排序和归并排序要了解其思想
冒泡排序
int[] a3 = new int[]{3,4,1,6,3,9,-10};
for(int i = 0;i<a3.length;i++){
System.out.print(a3[i]+"\t");
}
//冒泡排序
for(int i= 0;i<a3.length-1;i++){ //外层表示总共要交换几大轮;8个元素要有7大轮
for(int j= 0;j<a3.length-1-i;j++){//针对每一大轮,要交换几次
if(a3[j]>a3[j+1]){
int temp=a3[j];
a3[j]=a3[j+1];
a3[j+1]=temp;
}
}
}
for(int i = 0;i<a3.length;i++){
System.out.print(a3[i]+"\t");
}
快速排序
思想
代码实现
package Sort;
public class 快速排序 {
public static void main(String[] args) {
int[] arr = {6,1,2,7,9,3,4,5,10,8};
sort(arr, 0, arr.length-1);
print(arr);
}
public static void sort(int[] arr,int leftBound,int rightBound) {
if(leftBound >= rightBound) return;
int mid= partition(arr, leftBound, rightBound); //得到轴的位置
sort(arr, leftBound, mid-1); //左边排序
sort(arr, mid+1, rightBound); //右边排序
}
static int partition(int[] arr, int leftBound,int rightBound) {
int pivot = arr[rightBound]; //指定数组最右边的数是用来比较的值 轴
int left = leftBound;
int right = rightBound - 1;
while (left <= right) {
while(left <= right && arr[left] <= pivot) left++;
while(left <= right && arr[right] > pivot) right--;
if (left < right) {
//如果 左边的数比右边的数小 两个数交换
swap(arr, left, right);
}
}
//把left最后一次指向的位置与pivot(轴)的位置交换
swap(arr, left, rightBound);
return left; //返回轴的位置
}
static void swap(int[] arr,int i,int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
排序算法性能比较
快排的时间复杂度和冒泡排序的时间复杂度需要记住.