数组的基本操作和一些比较简单的排序算法

数组的基本操作和一些比较简单的排序算法

假设创建如下数组:

double [] mylist=new double[10];

下面是一些处理数组的例子

  • 随机初始化数组
    //使用0.0到100.0之间,但小于100.0的随机初始化数组
    for(int i=0;i<mylist.length;i++){
        mylist[i]=Math.random()*100;
    }
    
  • 使用输入值初始化数组
    java.util.Scanner input=new java.util.Scanner(System.in);
    System.out.println("请输入"+mylist.length+"个数");
    	for (int i = 0; i < mylist.length; i++) {
                mylist[i]=input.nextDouble();
            }
    
  • 输出数组
    for (int i = 0; i <mylist.length ; i++) {
        System.out.println(mylist[i]+" ");
    }
    
  • 求和
    double total=0;
    for (int i = 0; i <mylist.length ; i++) {
        total+=mylist[i];
    }
    
  • 找出最大元素
    double max=mylist[0];
    for (int i = 1; i <mylist.length; i++) {
        if(mylist[i]>max){
            max=mylist[i];
        }
    }
    
  • 找出最大元素的最小下标值
    double max=mylist[0];
    int indexOfMax=0;
    for (int i = 1; i <mylist.length; i++) {
    if(mylist[i]>max){
    		max=mylist[i];
    		indexOfMax=i;
    	}
    }
    
  • 随机打乱
    for(int i=mylist.length-1;i>0;i--){
        //产生一个随机的下标j(0=<j<=i)
        int j=(int)(Math.random()*(i+1));
        double temp=mylist[i];
        mylist[i]=mylist[j];
        mylist[j]=temp;
     }
    
  • 移动元素
    //获取第一个数组元素
    double temp=mylist[0];
    //从第二个元素开始向前移动一个位置
    for(int i=1;i<mylist.length;i++){
    mylist[i-1]=mylist[i];
    }
    //将第一个元素放到最后一个元素的位置
    mylist[mylist.length-1]=temp;
    
  • foreach循环
    for (double e : myList)
    System.out.print(e);
    //对myList中每个元素e进行以下操作,即遍历整个数组。
    //注意:变量e的数据类型必须与数组类型相同。
    
  • 复制数组
    1. 利用for循环逐个复制
    2. 利用静态方法arraycopy(注意此方法copy的c没有大写)
    arraycopy(原数组,原数组起始位置,目标数组,目标数组起始位置,元素个数)
    System.arraycopy(sourceArray, 0, targetArray, 0, sourceArray.length);
    System.arraycopy(source, 0, t, 0, source.length);
    //用此方法前要先声明目标数组并分配内存空间。
    
  • 数组传递给方法后值会改变
    • 对于基本数据类型参数,传递的是实参的值。

    • 而对于数组,传递的是引用。最好的描述为传递共享信息

    • 比如:要使用方法来改变数组,最好把数组传进去,不要使用数组下标的类型如int来定义方法参数.

      swap(a[0], a[1])
      public static void swap(int a1, int a2){}
      //这样改变的只是实参,而不会涉及数组。  ×
      swap(a)
      public static void swap(int[] array){}
      //这样传递的是整个数组。               √
      
  • 二分查找法 需要先从小到大排好序
    public class BinarySearch {
    //二分查找法(不含main函数)
        public static int binarySearch(int[] list, int key) {
            int low = 0;
            int high = list.length - 1;
            while (high >= low) { //此处不能用 > ,不然对只有一个元素的数组无法处理。
                int mid = (low + high) / 2;
                if (key < list[mid])
                    high = mid - 1;
                else if (key == list[mid])
                    return mid;
                else {
                    low = mid + 1;
                }
            }
            return -low-1;
        }
    }
    
  • 选择排序算法
    public class SelectSort {
        public static void main(String[] args) {
            //模拟数据
            int[] array = {52,63,14,59,68,35,8,67,45,99};
            System.out.println("原数组:");
            for (int i : array) {
                System.out.print(i+" ");
            }
            System.out.println();
            selectSort(array);
            System.out.println("排序后:");
            for (int i : array) {
                System.out.print(i+" ");
            }
        }
        public static void selectSort(int[] arr){
            for(int i=0;i<arr.length-1;i++){
                int min=i;
                for(int j=i+1;j<arr.length;j++){
                    if(arr[j]<arr[min]){
                        min=j;
                    }
                }
                if(min!=i){
                    swap(arr,i,min);
                }
            }
        }
    
    
        //完成数组两元素间交换
        public static void swap(int[] arr,int a,int b){
            int temp = arr[a];
            arr[a] = arr[b];
            arr[b] = temp;
        }
    }
    
    
  • Arrays类
    • 使用import.util.Arrays导入

      Arrays.sort(list, indexStart, indexEnd);//从小到大对start和end里面进行排序,不包括end。
      Arrays.parallelSort();//同上,但是多处理器这个会快些。
      Arrays.binarySearch();//二分查找法,必须提前按升序排好。
      Arrays.equals(list1, list2);//严格比较相等,一对一。
      Arrays.fill(list1, 5);//使用5填充整个数组。
      Arrays.fill(list1, 1, 5, 8);//使用8填充1至5地址,不包括5。
      Arrays.toString(list);//将数组返回成一个字符串
      
  • 冒泡排序
    public class BubbleSort {
        public static void main(String[] args) {
            int[] arr={6,3,8,2,9,1};
            System.out.println("排序前数组为:");
            for(int num:arr){
                System.out.print(num+" ");
            }
    
            for(int i=0;i<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;
                    }
                }
            }
            System.out.println();
            System.out.println("排序后的数组为:");
            for(int num:arr){
                System.out.print(num+" ");
            }
        }
    }
    
  • Java填充替换数组元素实例详解(提供多种重载形式)(这里只写两种常用的)

    数组中的元素定义完成后,可通过 Arrays 类的静态方法 fill() 来对数组中的元素进行替换,该方法通过各种重载形式可完成任意类型的数组元素的替换。 fill() 方法有两种参数类型,下面以 int 型数组为例介绍 fill() 方法的使用方法。

    (1) fill(int[] a, int value)

    ​ 该方法可将指定的 int 值分配给 int 型数组的每个元素。

    ​ a:要进行元素替换的数组; value:要存储数组中所有元素的值。

    ​ 例1:在项目中创建类Swap ,在主方法中创建一维数组,并实现通过fill()方法填充数组元素,最后将数组中的各个元素输出。

    import java.util.Arrays;
    public class Swap {
        public static void main(String[] args) {
            int arr[]=new int[10];
            Arrays.fill(arr,1);
            for(int i = 0;i<arr.length;i++) {
                System.out.println("第" + i+ "个元素是:" + arr[i]);
            }
        }
    }
    

    2) fill(int[] a, int frimIndex, int toIndex, int value)

    ​ 该方法将指定的int 值分配给int型数组指定范围内的每个元素。

    import java.util.Arrays;
    public class Swap {
        public static void main(String[] args) {
            int arr[]=new int[]{1,2,3,4,5,6,7,8,9};
            Arrays.fill(arr,1,3,666);
            Arrays.fill(arr,5,8,555);
            for(int i = 0;i<arr.length;i++) {
                System.out.println("第"+i+"个元素是:"+ arr[i]);
            }
        }
    
    }
    
  • 数组排序

    Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法。

    1.对基本数据类型的数组的排序

    说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;

    (2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是提供了默认的升序排列,没有提供相应的降序排列方法。

    (3)要对基础类型的数组进行降序排序,需要将这些数组转化为对应的封装类数组,如Integer[],Double[],Character[]等,对这些类数组进行排序。(其实还不如先进行升序排序,自己在转为将序)。

    默认的升序对数组排序

    函数原型:static **void sort**(int[] a) 对指定的 int 型数组按数字升序进行排序。

    static void **sort**(int[] a, int fromIndex, int toIndex) 对指定 int 型数组的指定范围按数字升序进行排序。

    代码实例:

    import java.util.Arrays;
    public class ArraysSort{
        public static void main(String args[])
        {
            int[] a={1,4,-1,5,0};
            Arrays.sort(a);//内部是优化快排  
            //数组a[]的内容变为{-1,0,1,4,5}
            for(int i=0;i<a.length;i++)
                System.out.print(a[i]+"  ");
        }
    }
    

    2.对复合数据类型的数据的排序

    函数原型: (1)public static void sort(T[] a,Comparator c) 根据指定比较器产生的顺序对指定对象数组进行排序。

    (2)public static void sort(T[] a,int fromIndex,int toIndex,Comparator c) 根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。

    说明:这个两个排序算法是“经过调优的合并排序”算法。

    代码实例:

    import java.util.Arrays;
    import java.util.Comparator;
    
    public class Arraysort {
        Point[] arr;
        
        Arraysort(){
            arr=new Point[4];    //定义对象数组arr,并分配存储的空间
            for(int i=0;i<4;i++)
                arr[i]=new Point();
        }
        
        public static void main(String[] args) {
            
            Arraysort sort=new Arraysort();
            sort.arr[0].x=2;sort.arr[0].y=1;    //初始化,对象数组中的数据
            sort.arr[1].x=2;sort.arr[1].y=2;
            sort.arr[2].x=1;sort.arr[2].y=2;
            sort.arr[3].x=0;sort.arr[3].y=1;
      
            Arrays.sort(sort.arr, new MyComprator());    //使用指定的排序器,进行排序
            for(int i=0;i<4;i++)    //输出排序结果
                System.out.println("("+sort.arr[i].x+","+sort.arr[i].y+")");
        }
    }
    
    class Point{
        int x;
        int y;
    }
    
    //比较器,x坐标从小到大排序;x相同时,按照y从小到大排序
    class MyComprator implements Comparator {
        public int compare(Object arg0, Object arg1) {
            Point t1=(Point)arg0;
            Point t2=(Point)arg1;
            if(t1.x != t2.x)
                return t1.x>t2.x? 1:-1;
            else
                return t1.y>t2.y? 1:-1;
        }
    }
    
  • 数组复制

    使用 copyOf() 方法和 copyOfRange() 方法

    Arrays 类的 copyOf() 方法与 copyOfRange() 方法都可实现对数组的复制。copyOf() 方法是复制数组至指定长度,copyOfRange() 方法则将指定数组的指定长度复制到一个新数组中。

    1. 使用 copyOf() 方法对数组进行复制

    Arrays 类的 copyOf() 方法的语法格式如下:

    Arrays.copyOf(dataType[] srcArray,int length);
    

    其中,srcArray 表示要进行复制的数组,length 表示复制后的新数组的长度。

    使用这种方法复制数组时,默认从原数组的第一个元素(索引值为 0)开始复制,目标数组的长度将为 length。如果 length 大于 srcArray.length,则目标数组中采用默认值填充;如果 length 小于 srcArray.length,则复制到第 length 个元素(索引值为 length-1)即止。

    注意:目标数组如果已经存在,将会被重构。

    例 1

    假设有一个数组中保存了 5 个成绩,现在需要在一个新数组中保存这 5 个成绩,同时留 3 个空余的元素供后期开发使用。

    使用 Arrays 类的 CopyOf() 方法完成数组复制的代码如下:

    import java.util.Arrays;
    public class Test19{
        public static void main(String[] args) {
            // 定义长度为 5 的数组
            int scores[] = new int[]{57,81,68,75,91};
    
            // 输出原数组
            System.out.println("原数组内容如下:");
    
            // 循环遍历原数组
            for(int i=0;i<scores.length;i++) {
                // 将数组元素输出
                System.out.print(scores[i]+"\t");
            }
    
            // 定义一个新的数组,将 scores 数组中的 5 个元素复制过来
            // 同时留 3 个内存空间供以后开发使用
            int[] newScores = (int[])Arrays.copyOf(scores,8);
            System.out.println("\n复制的新数组内容如下:");
    
            // 循环遍历复制后的新数组
            for(int j=0;j<newScores.length;j++) {
                // 将新数组的元素输出
                System.out.print(newScores[j]+"\t");
            }
        }
    }
    

    在上述代码中,由于原数组 scores 的长度为 5,而要复制的新数组 newScores 的长度为 8,因此在将原数组中的 5 个元素复制完之后,会采用默认值填充剩余 3 个元素的内容。

    因为原数组 scores 的数据类型为 int,而使用 Arrays.copyOf(scores,8) 方法复制数组之后返回的是 Object[] 类型,因此需要将 Object[] 数据类型强制转换为 int[] 类型。同时,也正因为 scores 的数据类型为 int,因此默认值为 0。

    运行的结果如下所示。

    原数组内容如下:
    57    81    68    75    91   
    复制的新数组内容如下:
    57    81    68    75    91    0    0    0
    
    2. 使用 CopyOfRange() 方法对数组进行复制

    Arrays 类的 CopyOfRange() 方法是另一种复制数组的方法,其语法形式如下:

    Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)
    

    其中:

    • srcArray 表示原数组。
    • startIndex 表示开始复制的起始索引,目标数组中将包含起始索引对应的元素,另外,startIndex 必须在 0 到 srcArray.length 之间。
    • endIndex 表示终止索引,目标数组中将不包含终止索引对应的元素,endIndex 必须大于等于 startIndex,可以大于 srcArray.length,如果大于 srcArray.length,则目标数组中使用默认值填充。

    注意:目标数组如果已经存在,将会被重构。

    例 2

    假设有一个名称为 scores 的数组其元素为 8 个,现在需要定义一个名称为 newScores 的新数组。新数组的元素为 scores 数组的前 5 个元素,并且顺序不变。

    使用 Arrays 类 copyOfRange() 方法完成数组复制的代码如下:

    public class Test20 {
        public static void main(String[] args) {
            // 定义长度为8的数组
            int scores[] = new int[] { 57, 81, 68, 75, 91, 66, 75, 84 };
            System.out.println("原数组内容如下:");
    
            // 循环遍历原数组
            for (int i = 0; i < scores.length; i++) {
                System.out.print(scores[i] + "\t");
            }
    
            // 复制原数组的前5个元素到newScores数组中
            int newScores[] = (int[]) Arrays.copyOfRange(scores, 0, 5);
            System.out.println("\n复制的新数组内容如下:");
    
            // 循环遍历目标数组,即复制后的新数组
            for (int j = 0; j < newScores.length; j++) {
                System.out.print(newScores[j] + "\t");
            }
        }
    }
    

    在上述代码中,原数组 scores 中包含有 8 个元素,使用 Arrays.copyOfRange() 方法可以将该数组复制到长度为 5 的 newScores 数组中,截取 scores 数组的前 5 个元素即可。

    该程序运行结果如下所示。

    原数组内容如下:
    57    81    68    75    91    66    75    84   
    复制的新数组内容如下:
    57    81    68    75    91
    
  • 数组查询

    Arrays类的binarySearch()方法,可使用二分搜索法来搜索指定的数组,以获得指定对象。该方法返回要搜索元素的索引值。binarySearch()方法提供了多种重载形式,用于满足各种类型数组的查询需要。binarySearch()方法有两种参数类型。

    (1)binarySearch(Object[], Object key)

    语法:binarySeach(Object[] a, Object key)

    a:要搜索的数组。

    key:要搜索的值。

    如果key包含在数组中,则返回搜索的索引;否则返回“-1”或“-”(插入点)。插入点是搜索键将要插入数组的那一点,即第一个大于此键的元素索引。

    import java.util.Arrays;//导入java.util.Arrays
    public class Reference {
    	public static void main(String[] args){
    		int arr[] = new int[]{1, 8, 9, 4, 5};//定义int型数组
    		Arrays.sort(arr);//将数组进行排序
    		int index = Arrays.binarySearch(arr, 4);//查找元素4的索引位置
    		System.out.println("4的索引位置是:"+index);//输出索引
    	}
    }
    

    (2)binarySearch(Object[]., int fromIndex, int toIndex, Object key)
    语法:binarySearch(Object[]., int fromIdex, int toIndex, Object key)

    a:要进行检索的数组。

    fromIndex:指定范围的开始处索引(包含)。

    toIndex:指定范围的结束处索引(不包含)。

    key:要搜索的元素。

    注意:如果指定的返回大于或等于数组的长度,则会报出ArrayIndexoutOfBoundsException异常

    import java.util.Arrays;//导入java.util.Arrays
    public class Rakel {
    	public static void main(String[] args){
    		String str[] = new String[]{"ab", "cd", "ef", "yz"};//定义String型数组str
    		Arrays.sort(str);//对数组进行排序
    		int index = Arrays.binarySearch(str, 0, 2, "cd");//在制定范围内搜索元素“cd”的索引位置
    		System.out.println("cd的索引位置是:"+index);//将索引输出
    	}
    }
    
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值