打怪升级之小白的大数据之旅(六)<Java基础语法之数组的基本算法>

打怪升级之小白的大数据之旅(六)

Java基础语法之数组的基本算法


目录

打怪升级之小白的大数据之旅(六)

上次回顾

 

数组基础算法

统计

查找指定元素

查找最大/小值及其位置

排序之冒泡排序

总结



上次回顾

上一期我们讲完了Java的数组的第一部分,数组的基本概念,本章开始分享数据的一些基础算法,由浅入深,下一章,会提到几个常见的排序,好了,开始进入正题


数组基础算法

统计

  • 获取数组元素的总和、均值、统计奇偶数个数等
  • 算法思路
    • 遍历数组,逐个累加,判断每个元素
  • 示例代码1:
    //示例代码:
    public class Demo1 {
        public static void main(String[] args) {
            int[] arr = {4,5,6,1,9};
            //求总和、均值
            int sum = 0;//因为0加上任何数都不影响结果
            for(int i=0; i<arr.length; i++){
                sum += arr[i];
            }
            //均值
            double avg = (double)sum/arr.length;
        }
    }
    

    示例代码2:

    //示例代码2:
    public class Demo2 {
        public static void main(String[] args) {
            int[] arr = {4,5,6,1,9};
            //求总乘积
            long result = 1;//因为1乘以任何数都不影响结果
            for(int i=0; i<arr.length; i++){
                result *= arr[i];
            }
        }
    }
    

    示例代码3:

    //示例代码3:
    public class Demo3 {
        public static void main(String[] args) {
            int[] arr = {4,5,6,1,9};
            //统计偶数个数
            int even = 0;
            for(int i=0; i<arr.length; i++){
                if(arr[i]%2==0){
                    even++;
                }
            }
        }
    }
    

查找指定元素

  • 查找某个指定元素在数组中的首次出现的位置(索引)
  • 常见查找算法有顺序查找二分查找(折半查找,前提要求数组中元素是按照大小顺序排序的)
  • 示例代码:
    //示例代码:
    public class Demo5Element {
        //查找value第一次在数组中出现的index
        public static void main(String[] args){
            int[] arr = {4,5,6,1,9};
            int value = 1;
            int index = -1;
    for(int i=0; i<arr.length; i++){
                if(arr[i] == value){
                    index = i;
                    break;
                }
            }
            if(index==-1){
                System.out.println(value + "不存在");
            }else{
                System.out.println(value + "的下标是" + index);
            }
        }
    }
    

查找最大/小值及其位置

  • 查找出数组中元素的最大值或最小值
    • 算法思路:
      (1)先假设第一个元素为最大/最小,用max/min变量表示最大/小值,
      (2)然后用max/min与后面的每个元素一一比较
    • 示例代码:
      //示例代码2:
      public class Demo5Element {
          public static void main(String[] args) {
              int[] arr = {4,5,6,1,9};
              //找最大值
              int max = arr[0];
              for(int i=1; i<arr.length; i++){
                  if(arr[i] > max){
                      max = arr[i];
                  }
              }
          }
      }
      
  • 查找最大值及其第一次出现的下标
    • 算法思路:
      (1)先假设第一个元素最大/最小,用变量index表示其位置,
      (2)然后用index位置的元素与后面的元素一一比较
        (3)   用变量index时刻记录目前比对的最大/小的下标
    • 示例代码:
      //示例代码2:
      public class Demo5Element {
          public static void main(String[] args) {
              //求最大值及其位置
              int[] arr = {4, 5, 6, 1, 9};
              int maxIndex=0;//假定索引0位置的元素最大
              for (int i = 1; i < arr.length; i++) {
                  if(arr[i]>arr[maxIndex]){
                      maxIndex=i;
                  }
              }
              System.out.println("最大值:" + arr[maxIndex]);
          }
      }
      
  •  查找最大值及其所有下标位置(最大值重复)
    • 算法思路:
      (1)先找到最大值
      (2)遍历数组,看哪些元素和最大值是一样的
    • 示例代码:
      //示例代码2:
      public class Demo5Element {
          public static void main(String[] args) {
              int[] arr = {4,9,5,6,1,9};
              //找最大值
              int max = arr[0];
              for(int i=1; i<arr.length; i++){
                  if(arr[i] > max){
                      max = arr[i];
                  }
              }
              //遍历数组,看哪些元素和最大值是一样的
              for(int i=0; i<arr.length; i++){
                  if(max == arr[i]){
                      System.out.print(i+"\t");
                  }
              }
          }
      }
      

 

 

排序之冒泡排序

  • Java中的经典算法之冒泡排序(Bubble Sort)
  • 把数组中元素按照从小到大(升序)或者从大到小(降序)顺序进行重新排列
  • 冒泡排序原理:
    • 比较两个相邻的元素,将值大的元素交换至右端,最大值出现在最后位置。
  • 算法思路:
    • 依次比较相邻的两个数,将小数放到前面,大数放到后面。
    • 即第一趟,首先比较第1个和第2个元素,将小数放到前面,大数放到后面。
    • 然后比较第2个和第3个元素,将小数放到前面,大数放到后面。
    • 如此继续,直到比较最后两个数,将小数放到前面,大数放到后面。
    • 重复第一趟步骤,直至全部排序完成。
  • 算法思路--伪代码
    例如:冒泡:从小到大,从左到右两两比较
    /*
    {6,3,8,2,9,1}
    	第一轮:
    	第1次:arr[0]与arr[1]比较,6>3成立,就交换,{3,6,8,2,9,1}
    	第2次:arr[1]与arr[2]比较,6>8不成立,不交换{3,6,8,2,9,1}
    	第3次:arr[2]与arr[3]比较,8>2成立,就交换,{3,6,2,8,9,1}
    	第4次:arr[3]与arr[4]比较,8>9不成立,不交换{3,6,2,8,9,1}
    	第5次:arr[4]与arr[5]比较,9>1成立,就交换,{3,6,2,8,1,9}
    	
    	第一轮结果:{3,6,2,8,1,9}   9已经到达正确位置,下一轮不用在参与
    
    	第二轮:
    	第1次:arr[0]与arr[1]比较,3>6不成立,不交换{3,6,2,8,1,9}
    	第2次:arr[1]与arr[2]比较,6>2成立,就交换,{3,2,6,8,1,9}
    	第3次:arr[2]与arr[3]比较,6>8不成立,不交换{3,2,6,8,1,9}
    	第4次:arr[3]与arr[4]比较,8>1成立,就交换,{3,2,6,1,8,9}
    	
    	第二轮结果:{3,2,6,1,8,9}   8已经到达正确位置,下一轮不用在参与
    	
    	第三轮:
    	第1次:arr[0]与arr[1]比较,3>2成立,就交换,{2,3,6,1,8,9}
    	第2次:arr[1]与arr[2]比较,3>6不成立,不交换{2,3,6,1,8,9}
    	第3次:arr[2]与arr[3]比较,6>1成立,就交换,{2,3,1,6,8,9}
    	
    	第三轮结果:{2,3,1,6,8,9}   6已经到达正确位置,下一轮不用在参与
    	
    	第四轮:
    	第1次:arr[0]与arr[1]比较,2>3不成立,不交换{2,3,1,6,8,9} 
    	第2次:arr[1]与arr[2]比较,3>1成立,就交换,{2,1,3,6,8,9} 
    	
    	第四轮结果:{2,1,3,6,8,9}    3已经到达正确位置,下一轮不用在参与
    	
    	第五轮
    	第1次:arr[0]与arr[1]比较,2>1成立,就交换,{1,2,3,6,8,9}
    	
    	第五轮结果:{1,2,3,6,8,9}   2已经到达正确位置,下一轮不用在参与
    	
    	剩下1,肯定是最小的了,不用比较了
    	
    	6个元素,比较了5轮, n个元素需要n-1轮
    	每一轮比较很多次
    */

    示例代码

    //示例代码2:
    public class Demo5DelElement {
        public static void main(String[] args){
            int[] arr = {6,3,8,2,9,1};  //arr.length = 6
    //i=1,2,3,4,5  一共5轮
            for(int i=1; i<arr.length; i++){//轮数
    			/*
    			i=1,第1轮,j=0,1,2,3,4   arr[j]与arr[j+1]
    			i=2,第2轮,j=0,1,2,3     arr[j]与arr[j+1]
    			i=3,第3轮,j=0,1,2       arr[j]与arr[j+1]
    			i=4,第4轮,j=0,1         arr[j]与arr[j+1]
    			i=5,第5轮,j=0           arr[j]与arr[j+1]
    			
    			j=0, j<=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;
                    }
                }
            }
    //结果
            for(int i=0; i<arr.length; i++){
                System.out.print(arr[i] + " ");
            }
        }
    

     


总结

    本章对数据基础算法,统计、指定元素查找、最大/最小值、冒泡排序等进行了介绍,算法重在理解。。下一章就是数组的其他排序算法,不足之处,欢迎后台吐槽~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值