一、今日收获
1.比较值
1.1 最大值
两个数:if(a>b) max=a;
多个数:
-
遍历时,每个数值与最大值比较
1 public class study { 2 public static void main(String[] args) { 3 int[] a= {2,3,4,5,9,7,8}; 4 int max=0; 5 for(int i=0;i<a.length;i++) { 6 if(a[i]>max) { 7 max=a[i]; 8 } 9 } 10 System.out.println("最大值是:"+max); 11 } 12 }
-
遍历时,两两相邻比较找最大值
1 public class study { 2 public static void main(String[] args) { 3 int[] a= {2,3,4,5,9,7,8}; 4 int max=0; 5 for(int i=0;i<a.length-1;i++) { 6 if(a[i]>a[i+1]&&a[i]>max) { 7 max=a[i]; 8 }else if(a[i+1]>a[i]&&a[i+1]>max) { 9 max=a[i+1]; 10 } 11 } 12 System.out.println("最大值是:"+max); 13 } 14 }
-
将数组分为两部分,将后部分逐一与前部分每个值比较
1 public class study { 2 public static void main(String[] args) { 3 int[] a= {2,3,4,5,9,7,8}; 4 int max=0; 5 for(int i=0;i<a.length;i++) { 6 for(int j=i-1;j>=0;j--) { 7 /** 8 * 将数组分为两部分 9 * 将后部分的第一个逐一与前部分每一个比较 10 * 如果当前元素大,并且也大于最大值变量,则将当前元素赋值给最大值变量 11 */ 12 if(a[j+1]>a[j]&&a[j+1]>max) { 13 max=a[j+1]; 14 } 15 } 16 } 17 System.out.println("最大值是:"+max); 18 } 19 }
1.2 最小值
两个数:if(a<b) min=a;
多个数:
-
遍历时,每个数值与最小值比较
-
遍历时,两两相邻比较找最小值
-
将数组分为两部分,将后部分逐一与前部分每个值比较
1.3 平均值
一组数据的和除以数据的个数
2.数字排序
2.1 冒泡排序
原理:
-
逐一比较数组中相邻的两个元素,如果后面的数字小于前面的数字,就交换先后元素
-
经过一个轮次的比较,一定有一个最大的排在最后的位置
-
每次比较剩下的元素,经过n-1次比较,可以实现排序
代码:
1 import java.util.Arrays; 2 public class study { 3 public static void main(String[] args) { 4 int[] a= {2,3,4,5,9,7,8}; 5 for(int i=0;i<a.length-1;i++) { 6 for(int j=0;j<a.length-i-1;j++) { 7 if(a[j]>a[j+1]) { 8 int t=a[j]; 9 a[j]=a[j+1]; 10 a[j+1]=t; 11 } 12 } 13 } 14 System.out.println("排序后的数组:"+Arrays.toString(a)); 15 } 16 }
2.2 选择排序
原理:
-
将数组中的每个元素与第一个元素比较,如果这个元素小于第一个元素,就将这两个元素交换位置
-
每轮使用第一步的规则可以选择出一个最小元素放到第一个位置
-
经过n–1轮比较完成排序
代码:
1 import java.util.Arrays; 2 public class study { 3 public static void main(String[] args) { 4 int[] a= {2,3,4,5,9,7,8}; 5 for(int i=0;i<a.length-1;i++) { 6 for(int j=i+1;j<a.length;j++) { 7 if(a[i]>a[j]) { 8 int t=a[i]; 9 a[i]=a[j]; 10 a[j]=t; 11 } 12 } 13 } 14 System.out.println("排序后的数组:"+Arrays.toString(a)); 15 } 16 }
2.3 插入排序
原理:
-
将数组分为两部分,将后部分的每一个元素逐一与前部分每一个元素比较,如果当前元素小,就替换
-
找到合理位置插入
代码:
1 import java.util.Arrays; 2 public class study { 3 public static void main(String[] args) { 4 int[] a= {2,3,4,5,9,7,8}; 5 int i,j,k; 6 for(i=1;i<a.length;i++) { 7 k=a[i]; 8 for(j=i-1;j>=0&&k<a[j];j--) { 9 a[j+1]=a[j]; 10 } 11 a[j+1]=k; 12 } 13 System.out.println("排序后的数组:"+Arrays.toString(a)); 14 } 15 }
2.4 快速排序
原理:
-
首先选定基准值,一般设置low所对应的元素位置为基准值
-
在高位指针始终不小于低位指针的前提下,
高位指针开始判断其是否比基准值大,如果符合高位指针减1,继续寻找,直到找到不符合的情况,然后把该值赋给此时低位所在位置。
低位指针开始判断是否比基准值小,如果符合,低位指针加1,继续寻找,直到找到不符合情况, 然后把该值赋给此时高位指针所指位置。
如此反复,直到低位高位指针重合,此时再将当前的基准值赋给低位指针所指的值,这样就完成了一次排序。此时,基准值就到了其最终位置上,然后继续对以基准值为界的两部分进行排序。
代码:
1 import java.util.Arrays; 2 public class QuickSortDemo{ 3 public static void main(String[] args) { 4 int vec[]= {37,47,23,100,19,56,56,99,9}; 5 QuickSortDemo q=new QuickSortDemo(); 6 q.quicksort(vec,0,vec.length-1); 7 System.out.println("排序后:"+Arrays.toString(vec)); 8 } 9 public void quicksort(int a[],int low,int high) { 10 if(low<high) { 11 int pivot,p_pos,i; 12 p_pos=low; //p_pos指向low,即位索引为0位置 13 pivot=a[p_pos]; //将0位置上的数值赋给pivot 14 for(i=low+1;i<=high;i++) { 15 if(a[i]>pivot) { 16 p_pos++; 17 int tmp=a[p_pos]; 18 a[p_pos]=a[i]; 19 a[i]=tmp; 20 } 21 } 22 int tmp=a[low]; 23 a[low]=a[p_pos]; 24 a[p_pos]=tmp; 25 quicksort(a,low,p_pos-1); //递归调用,排序左半区 26 quicksort(a,p_pos+1,high); //递归调用,排序右半区 27 } 28 } 29 }
3.查找
3.1 顺序查找
基本思想:让关键字与队列中的数从第一个开始逐个比较,直到找到与给定关键字相同的数为止。若全部比较也没有找到与关键字相同的数,即查找失败。
1 public class study{ 2 public static void main(String[] args) { 3 //定义一维数据 4 int[] ary= {2,3,4,5,9,7,8}; 5 //定义要查找的数据 6 int find=5; 7 //定义标示符,即找到的位置 8 int count=-1; 9 for(int i=0;i<ary.length;i++) { 10 if(find==ary[i]) { 11 count=i; 12 } 13 } 14 if(count!=-1) { 15 System.out.println("下标在:"+count+"的位置"); 16 }else { 17 System.out.println("对不起,没有找到!"); 18 } 19 } 20 }
3.2 二分查找
步骤:
-
查找前,元素须进行排序
-
确定区域中的中间位置:mid=(low+high)/2
-
行待查的k值与V[mid...n]key比较:若相等,则查找成功并返回此位置,否则需确定新的查找区域,继续二分查找
1 public class study{ 2 public static void main(String[] args) { 3 //定义一维数据 4 int[] a= {2,3,4,5,9,7,8}; 5 //定义要查找的数据 6 int find=5; 7 //定义标示符,即找到的位置 8 int count=-1; 9 int low=0; 10 int high=a.length-1; 11 while(low<=high) { 12 int mid=(low+high)/2; 13 if(a[mid]==find) { 14 count=mid; 15 break; 16 } 17 else if(a[mid]>find) { 18 high=mid-1; 19 } 20 else { 21 low=mid+1; 22 } 23 } 24 if(count!=-1) { 25 System.out.println("下标在:"+count+"的位置"); 26 }else { 27 System.out.println("对不起,没有找到!"); 28 } 29 } 30 }
二、遇到问题
1.知识点较多,记忆较难
2.对于排序,尤其是插入排序和快速排序未能理解与掌握
三、明日学习
1.学习Java工具类中算法的实现
2.完成第三章综合实例和练习