• 数组排序、递归——(Java学习笔记二)


    升序: 
        选择排序:
            选定一个元素,一次和后面的元素相比较,如果选定的元素大雨后面的比较元素,就交换位置
            先出现最小值,最后出现最大值。
     public static void main(String[] args) {
      int[] arr = {5,8,9,12,55,565,421,12,2512,-5,-56};
      sortMethod(arr);
      p(arr);
     }
       //排序核心代码
     private static void sortMethod(int arr[]) {
      for(int i = 0 ;i<arr.length - 1;i++){
       for(int j = i + 1;j<arr.length;j++){
        if(arr[i] > arr[j]){
         int temp = arr[j];
          arr[j] = arr[i];
          arr[i] = temp;
        }
       }
      }
     }
     
    //打印数组元素
     static void p(int[] arr) {
      String ret = "[";
      for(int i = 0;i<arr.length;i++){
       ret += arr[i];
       if(i == arr.length - 1){
        ret += "]";
       }else{
        ret += ",";
       }
      }
      System.out.println("---------->"+ret);
    

      

     冒泡排序:
            相邻两个元素依次相比较
            先出现最大值,最后出现最小值。
    public static void main(String[] args) {
      int arr[] = {6,9,4589,442,458,5232,-788,7,545,-44,55,-11};
      sortMethod(arr);
      p(arr);
     }
     private static void p(int[] arr) {
      String ret = "[";
      for(int i = 0; i < arr.length; i ++){
       ret += arr[i];
       if( i == arr.length - 1){
        ret += "]";
       }else{
        ret += ",";
       }
      }
      System.out.println("---------->" + ret);
     }
     private static void sortMethod(int[] arr) {
      for(int j = 1;j<arr.length;j++){
       for(int i = 0; i <arr.length - j;i++){
        if(arr[i] > arr[i + 1]){
         int temp = arr[i];
         arr[i] = arr[i + 1];
         arr[i + 1] = temp;
        }
       }
      }
     }
    二分查找法:
        先对代码进行排序,再取中间值,再拿指定值跟中间值进行比较,如果小于中间值,查找范围就变成最小的索引值到中间值索引减1,如果指定值大于中间值,则查找范围变成中间值索引加1到最大的索引值。
    优点:缩小查找范围,提高性能
     1 //查找指定数组指定元素的索引值。    
     2 public static void main(String[] args) {
     3   int[] arr = {5,4,231,45,75,45,11,-11,-21,-45};
     4   int key = 45;
     5   sortMethod(arr);
     6   printSort(arr);
     7   int index = binarySeach(arr,key,0,arr.length - 1);
     8   System.out.println("----------->所求索引值:"+index);
     9  }
    10 //二分查找法核心代码
    11  private static int binarySeach(int[] arr, int key,int fromIndex,int toInedx) {
    12   //最小索引与最大索引
    13   //fromIndex 表示从哪个位置开始查找,toIndex表示到那个位置结束
    14   int minIndex = fromIndex,maxIndex = toInedx;
    15   while(maxIndex >= minIndex){
    16    //中间索引
    17    int midIndex = (maxIndex + minIndex)/2;
    18    //中间索引的值
    19    int midIndexVal = arr[midIndex];
    20    if(key > midIndexVal){
    21     minIndex = midIndex + 1;
    22    }else if(key < midIndexVal){
    23     maxIndex = midIndex - 1;
    24    }else{
    25     return midIndex;
    26    }
    27   }
    28   return -1;
    29  }
    30 //打印排序后的代码
    31  private static void printSort(int[] arr) {
    32   String ret = "[";
    33   for(int i = 0;i<arr.length;i++){
    34    ret +=arr[i];
    35    if(i == arr.length - 1){
    36     ret += "]";
    37    }else{
    38     ret += ",";
    39    }
    40   }
    41   System.out.println("----------->排序:" + ret);
    42  }
    43 //对代码进行排序
    44  private static void sortMethod(int[] arr) {
    45   for(int j = 0;j<arr.length - 1;j++){
    46    for(int i = 0;i<arr.length - j - 1;i++){
    47     if(arr[i] > arr[i + 1]){
    48      int temp = arr[i];
    49       arr[i] = arr[i+1];
    50       arr[i+1] = temp;
    51     }
    52    }
    53   }
    54  }

    数组的拷贝:

     1     /**
     2  *
     3  * @author Essence
     4  *arraycopy(Object src, int srcPos, Object dest,int destPos, int length)
     5  *该方法接收四个参数
     6  *object src :原数组,即被拷贝的数组
     7  *int srcPos: 原数组的目标位置 即从哪个位置开始拷贝起
     8  *Object dest:目标数组 即用来存储被拷贝的数组
     9  *int destPos:目标数组中的起始位置,即向目标数组中插入数据的起始位置
    10  *int length:要复制的元素数量
    11  */
    12     public static void main(String[] args) {
    13   String[] arr = {"A","B","C","D"};
    14   String[] arr1 = new String[5];
    15   System.out.println(Arrays.toString(arr1)); // 拷贝之前 : [null, null, null, null, null]
    16   System.arraycopy(arr, 1, arr1,2, 3);
    17   System.out.println(Arrays.toString(arr1)); //拷贝之后: [null, null, B, C, D]
    18  
    19  }

    可变参数:

     1 /**
     2  * Java5 出现的新特性 参数可变
     3  * 可变参数必须作为参数的最后一个参数 ,参数可以直接传递0到n个
     4  *其本质上就是数组
     5  * method(int ... arr)
     6  * @author Essence
     7  *
     8  */
     9     public static void main(String[] args) {
    10   int[] arr = {1,2,347,7,78,9};
    11   System.out.println(getSum(arr));
    12   /**
    13    * 可变参数调用特点:
    14    * getSum(1,2,34,5)
    15    */
    16   System.out.println(getSum(1,2,34,5));
    17  
    18  }
    19  private static int getSum(int ... arr) {
    20   int sum = 0;
    21   for(int i = 0;i<arr.length;i++){
    22    sum += arr[i];
    23   }
    24   return sum;
    25  }
    26  }
    可变参数可以当做一位数组来调用:getSum(new int[] {1,2,3,4,5});
    也可以直接写参数,个数任意,但是类型必须一致:getSum(1,2,34,5)
    递归:
        基本思想:自己调用自己
        结构:
            递归头:定义递归结束的时候,什么时候不调用自身方法。如果没有定义头,将会陷入死循环
            递归体:什么时候需要调用自身方法
    利用递归解决阶乘问题:
     1   public class Demo{
     2             public static void main(String[] args) {
     3   long sum = factorial(10);
     4   System.out.println(sum);
     5  }
     6  static long factorial(int n){
     7   if(n==1){
     8    return 1;
     9   }else{
    10    return n*factorial(n-1);
    11   }
    12  }
    13 }

    Java编程思想上的两个题斐波那契数列与吸血鬼数字

    斐波那契数列:  

    /*
    * 1,1,2,3,5,8,13,21,34
    * 起那两个数是第三个数的和
    * 斐波那契数列
    * F(n) = F(n-1)+F(n-2)
    */
    方法一:
    private static void fibonacci(int n) { int arr[] = new int[n],sum = 0; arr[0] = arr[1] = 1; for(int i = 2;i<arr.length;i++){ arr[i] = arr[i - 1] + arr[i-2]; System.out.println("arr["+i+"] "+arr[i]); sum += arr[i]; } System.out.println("斐波那契数列之和:" +sum); } 方法二: private static int sumFibonacci(int n) { if(n<1){ return 1; }else{ return sumFibonacci(n - 1) + sumFibonacci(n - 2); } } private static void getFibonacci(int n) { for(int i = 0;i <= n;i++){ int f = sumFibonacci(i); System.out.print(f + " "); if(i%3 == 0){ System.out.println(); } } } 方法三: private static void fibbonacci1(int n){ int a = 1,b = 1,c = 0 , sum = 0; System.out.println(a+" "+b+" "); for(int i = 1;i<=n;i++){ c =a +b; a = b; b = c; sum += c; System.out.print(c+" "); if(i%3==0){ System.out.println(); } } System.out.println("斐波那契数列之和:" +sum); }

    吸血鬼数字:

    /*
    *1260=21*60
    *1827=21*87
    *2187=27*81
    */
    1
    private static void vampireNumber1() { 2 for(int i = 1;i<100;i++){ 3 for(int j = 1;j<100;j++){ 4 if(i*j>1000){ 5 String a = i+""+j; 6 String b = i*j+""; 7 if(equals(a,b)){ 8 System.out.println(i+" "+j+" "+i*j); 9 } 10 } 11 } 12 } 13 } 14 private static boolean equals(String a, String b) { 15 // TODO Auto-generated method stub 16 char[] aArrays ,bArrays; 17 aArrays = a.toCharArray(); 18 bArrays = b.toCharArray(); 19 Arrays.sort(aArrays); 20 Arrays.sort(bArrays); 21 if(Arrays.equals(aArrays,bArrays)){ 22 return true; 23 } 24 return false; 25 }
  • 相关阅读:
    java面试-synchronized底层实现机制
    java面试-内存分配与回收策略
    java面试-对象的创建、内存布局、访问定位
    推荐算法-余弦相似度
    推荐算法-欧几里得距离
    MySQL总结
    MySQL事务
    MySQL-一条sql语句的执行顺序
    mysql 表格操作指令大全(Show、desc、create、insert into、delete、select、drop、update、alter)
    mysql 创建数据数据库 (避免新建的库名已经存在、设置编码)
  • 原文地址:https://www.cnblogs.com/Essence/p/3961857.html
Copyright © 2020-2023  润新知