zoukankan      html  css  js  c++  java
  • 数组的一些知识点和插入选择冒泡排序

    package test.sghuzu;

    import java.lang.reflect.Array;
    import java.util.Arrays;

    public class Test1 {
        /**
         Java中的内存分配
         Java程序在运行时,需要在内存中分配空间。
         为了提高效率,对每一片空间都进行了划分,因为每一片1区域都有特定的处理数据方式和内存管理方式
        
             栈  存储局部变量
             堆  存储new出来的东西
             方法区  暂时不管
             本地方法区  系统有关,不管
             寄存器  给CPU使用,也不管
             
                 局部变量,在方法中定义或者方法中声明的变量都是局部变量
             
             
                 栈内存的特点:
                     每一个new出来的东西都有地址值
                     每一个变量都有默认值
                         byte,short,int,long 0
                         float,double 0.0
                         char 'u0000'
                         boolean false
                     使用完毕就变成了垃圾,但是并没有立即回收。会在垃圾回收器空闲的时候回收
                     栈内存中的值数据用完就释放掉。
         */
        
        /*
              数组声明:
                  数据类型[] 数组名;
                  数据类型   数组名[];
                  两种方式效果一样,读法不同,第一个叫做一个名为数组名的数据类型数组,第二种叫做一个数据类型的 数组变量数组名。第二种更早,现在一般用第一种
                  
              数组的初始化:
                  两种初始化方式的区别在于数组的长度。第一种是自己固定数组长度,初始值由系统的默认值填充;第二种是自己固定数组的值,数组的长度由系统根据数组的值确定
                  动态初始化:
                      例子: int[] arr=new int[3];
                  静态初始化:
                      例子:int[] arr=new int[]{1,2,3};
                      上面这种形式不常用了,我们一般喜欢使用它的简写形式:
                           int[] arr={1,2,3};
                          
              值得注意的是:静态初始化数组实际上也是new声明的,不过是在声明赋了初始默认值后使用你给的值替代原来的默认值。和一些数组长度的不同控制
              
              数组的遍历,数组中的元素使用下标来指定并做一系列操作。数组名.length得到数组的长度。
          
         */
        
        /*
         * 求最值:
         以求最大值为例,选出一个数组中的值为参照物,依次使用其他的数组元素和它进行比较,比它大的取代它和剩下的元素进行比较,剩下的就是最大的元素了
        */
        /*
         逆序:
         新建一个类型和长度都和原数组相同的数组,for循环依次输出原数组的元素,并将元素赋值给新数组位置为数组长度-旧数组现在下标位置的元素
         */
        /*
         数组中元素从大到小排序
         */
        public static void main(String[] args){
            int[] arr=new int[]{43,12,46,23,45,12,98};
            
            /*int[] arr1=rebackArr(arr);
            iteratorArrForEach(arr);
            System.out.println();
            iteratorArr(arr1);*/
            
            /*int[] arr1=SortMaxToMin(arr);    
            iteratorArrForEach(arr);
            System.out.println();
            iteratorArr(arr1);*/
            iteratorArrForEach(arr);
            
            //SortMaxToMin3(arr);
            System.out.println();
            iteratorArrForEach(arr);
            
        }
        
        public static void iteratorArr(int[] arr){
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+" ");
            }
        }
        public static void iteratorArrForEach(int[] arr){
            for(int i=0;i<arr.length;i++){
                System.out.print(arr[i]+" ");
            }
        }
        
        public static int getMax(int[] arr){
            int max=arr[0];
            
            for(int i=1;i<arr.length;i++){
                if(arr[i]>arr[i-1]){
                    max=arr[i];
                }
            }
            return max;
        }
        
        public static int getMin(int[] arr){
            int min=arr[0];
            
            for(int i=1;i<arr.length;i++){
                if(arr[i]<arr[i-1]){
                    min=arr[i];
                }
            }
            return min;
        }
        
        public static int[] rebackArr(int[] arr){
            int[] arr1=new int[arr.length];
            for(int i=0,j=arr.length-1;i<arr.length;i++,j--){
                arr1[i]=arr[j];
            }
            return arr1;    
        }
        
        public static  int[] SortMaxToMin(int[] arr){
            /**
             * 利用的是前面求最值的思路,应该是选择排序吧!
             *
             */
            /**
             * 一般进行数组的排序都将改变原来数组的位置。因为数组是引用数据类型,针对同一个堆内存地址的改变。所以需要将原来数组的元素全部放入另一个数组之内
             * ,操作另一个数组进行排序才会不改变原来数组。注意,新数组不能是调用原数组的引用
             */
            int[] arr1=Arrays.copyOf(arr, arr.length);
            //iteratorArr(arr1);
            //int[] arr1=new int[arr.length];
            /*for(int i=0;i<arr.length;i++){
                arr1[i]=arr[i];
            }*/
            for(int j=0;j<arr1.length;j++){
                for(int i=j+1;i<arr1.length;i++){                
                    if(arr1[i]>arr1[j]){
                        arr1[j]=arr1[j]^arr1[i];    
                        arr1[i]=arr1[j]^arr1[i];
                        arr1[j]=arr1[j]^arr1[i];                    
                    }
                }
                
            }
            return arr1;
        }
        public static   int[] SortMaxToMin1(int[] arr){
            /**
             * 选择排序,第一个开始,元素与它右边的元素比较,大的向右跑,一轮下来,最大的数就是最后面的
             * 接下来就是循环了,依旧进行一样的循环
             *
             for(int i=0;i<arr.length;i++){
                for(int j=1;j<arr.length;j++){
                    if(arr[j]>arr[j-1]){
                        arr[j]=arr[j]+arr[j-1]-(arr[j-1]=arr[j]);
                        
                    }            
                }
            }
            
            这样可以达到排序的效果,但有心你就可以发现,第一轮已经确定最后一个是最大的了,第二轮还进行判断的话就代码多余了,所以我们进行优化,每一轮比较的次数比上一轮少1
            所以语法应该是这样的:
            for(int i=0;i<arr.length;i++){
                for(int j=1;j<arr.length-i;j++){
                    if(arr[j]>arr[j-1]){
                        arr[j]=arr[j]+arr[j-1]-(arr[j-1]=arr[j]);
                        
                    }            
                }
            }
             */
            for(int i=0;i<arr.length;i++){
                for(int j=1;j<arr.length-i;j++){
                    if(arr[j]>arr[j-1]){
                        arr[j]=arr[j]+arr[j-1]-(arr[j-1]=arr[j]);
                        
                    }            
                }
            }
            
            return arr;
        }
        
      package test.sghuzu;

    public class Test8 {//我的插入排序
        public static void main(String[] args){
            int arr[]={12,32,76,23,97,12,32,4};
            for(int j=0;j<arr.length-1;j++){
                for(int i=0;i<arr.length;i++){
                    if(arr[j]>arr[i]){
                        int temp=arr[j];
                        arr[j]=arr[i];
                        arr[i]=temp;
                        break;
                    }
                }
            }
            for(int s:arr){
                System.out.print(s+" ");
            }
            
        }

    }


        
        
        
        /* 一些源码 */
        //非基本类型  
        public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {  
                T[] copy = ((Object)newType == (Object)Object[].class)  
                    ? (T[]) new Object[newLength]  
                    : (T[]) Array.newInstance(newType.getComponentType(), newLength);  
                System.arraycopy(original, 0, copy, 0,  
                                 Math.min(original.length, newLength));  
                return copy;  
            }  
        //基本数据类型  
        public static int[] copyOf(int[] original, int newLength) {  
                int[] copy = new int[newLength];  
                System.arraycopy(original, 0, copy, 0,  
                                 Math.min(original.length, newLength));  
                return copy;  
            }  

    关于数组的声明和赋值:

    public class Test {
        public static void main(String[] args){
            int[] i;
            i=new int[]{1,2,3};
            int[] j;
            i=new int[3];
            /**
             int[] k;
             k={1,2,3};        
             
             先声明,后赋值,本来是没有错的,但是int[] a={1,2,3};是一种简写形式,拆分了会报错。
             Java中{}代表的而是代码块的意思,如果k={1,2,3};相当于将一个{1,2,3}的代码块赋值给数组,所以报错
             */
            
        }
    
    }

    数组的逆序:

    package test.sghuzu;
    
    public class Test3 {
        public static void main(String[] args){
            int[] arr=new int[]{12,33,67,98,34,12,43,65,78};
            /**
             * 逆序
             */
            reversed(arr);
            System.out.println();
            reversed2(arr);
            
        }
        
        public static void reversed(int[] arr){
            for(int a:arr){
                System.out.print(a+"	");
            }
            System.out.println();
            int length=arr.length;
            for(int i=0;i<length/2;i++){//换length/2次
                arr[i]=arr[i]^arr[length-i-1];
                arr[length-1-i]=arr[i]^arr[length-1-i];
                arr[i]=arr[i]^arr[length-1-i];
                
            }
            for(int a:arr){
                System.out.print(a+"	");
            }
        }
        
        public static void reversed2(int[] arr){
            for(int a:arr){
                System.out.print(a+"	");
            }
            System.out.println();
            for(int i=0,j=arr.length-1;i<=j;i++,j--){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;    
                
                
            }
            for(int a:arr){
                System.out.print(a+"	");
            }
        }
        
    
    }

    寻找数组元素:

    package test.sghuzu;
    
    import java.util.Scanner;
    
    public class Test4 {
        public static void main(String[] args){
            Scanner input=new Scanner(System.in);
            String a[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期天","星期一","星期三"};
            System.out.println("查找指定星期第一次出现的下标,-1表示不存在指定星期!");
            System.out.println("请输入查找的第一次出现的星期:");
            while(true){
                try{
                    String s=input.next();
                    int x=findFirstIndex(a,s);
                    System.out.println(x);
                    break;
                }catch(Exception e){
                    System.out.println("输入异常,请重新输入!");
                }
            }
            
            
        }
        public static int findFirstIndex(String[] arr,String content){
            for(int i=0;i<arr.length;i++){
                if(arr[i]==content||arr[i].equals(content)){
                    return i;
                }
            }
            
            return -1;
            
        }
        public static int findFirstIndex2(String[] arr,String content){
            int index=-1;
            for(int i=0;i<arr.length;i++){
                if(arr[i]==content||arr[i].equals(content)){
                    index=i;
                    break;
                }
            }
            
            return index;
            
        }
    
    }


        
        

    }

  • 相关阅读:
    货币计算请避免使用float和double
    4、刷新令牌
    Advanced Go Concurrency Patterns
    Go Concurrency Patterns: Pipelines and cancellation
    Go Concurrency Patterns: Context At Google, we require that Go programmers pass a Context parameter as the first argument to every function on the call path between incoming and outgoing requests.
    OSS的SDK网络超时处理
    Redis 到底是怎么实现“附近的人”这个功能的呢?
    阿里云 Redis 开发规范
    百度云的「极速秒传」使用的是什么技术?
    linux中高并发socket最大连接数的优化详解
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5521426.html
Copyright © 2011-2022 走看看