二维数组与排序

一、二维数组

1.二维数组英文名:two dimension array

2.二维数组定义:

(1)初始化:

①动态数组: int[][] arr=new int[2][3];

②静态数组: int[][] arr={{1,2,3,4},{2,1,6,5}};

③特殊的二位数组声明方式:int[]arr[]=new int[2][3];

(2)定义:二维数组中的每个元素又是一个一维数组

注意:每个一维数组的长度不一定相等                

3.获取二维数组的长度(length属性):

int[][] arr={{1,2,3,4},{2,1,6,5}};

//遍历二维数组中的每个元素

for(int i=0;i<arr.lengrh;i++){//arr.length获取二维数组中元素的个数(一维数组的个数)

        //遍历二维数组中的一维数组中的元素

        for(int j=0;j<arr[i].length;j++){//arr[i].length获取二维数组中的每个元素的长度(一维数组的长度)

                Sysem.out.print(a[i][j]);//输出二维数组中的每一个元素(输出一维数组)

              

        }

        Sysem.out.println();//换行

}

Sysem.out.println(a[1][2]); //输出的是第2个二维数组中的第3个元素:6

4.二维数组的存储结构:

(1)二维数组的初始化结构:

 (2)二维数组的中赋值arr[1][1]=8(二维数组中第二个一维数组的第2个赋值为:8):

      5.杨辉三角:

(1)规律:arr[i][j]=arr[i-1][j]+arr[i-1][j-1];

(2)注意:当j=0或者j=arr[i].length-1时:arr[i][j]=1;

package guanqiawu;
import java.util.Scanner;
public class two_2_1 {
    public static void main(String[] args) {
        Scanner  sr=new Scanner(System.in);
        System.out.print("请输入你想打印的杨辉三角行数:");
        //int a=sr.nextInt();
        int [][]b=new int[sr.nextInt()][];
        for(int i=0;i<b.length;i++){
            b[i]=new int[i+1];
            for(int j=0;j<b[i].length;j++){
                if(j==0||j==b[i].length-1){
                    b[i][j]=1;
                }else{
                    b[i][j]=b[i-1][j]+b[i-1][j-1];
                }
                if(j==b[i].length-1){
                    System.out.println(b[i][j]);
                }else {
                    System.out.print(b[i][j]+" ");
                }
            }
        }
    }
}

二、排序

1.comparable接口:

(1)成员变量定义方法:private string esername;//学生类的姓名;private string age;//学生类的年龄

2.冒泡排序:

(1)原理:两个相邻之间的元素进行比较,前一个元素小于后一个元素就将较大的放在后面的位置

(2)类名:bubble

(3)构造方法:Bubble()//创建Bubble对象

(4)成员方法:

①public static void sort(Comparable[] a);{//对数组内的元素进行排序

        for(int i=a.length-1;i>0;i--){

                for(int j=0;j<i;j++){

                        //比较索引j和索引j+1处的值

                        if(greater(a[j],a[j+1])){

                                exch(a,j,j+1);

                        }

                }

        }

}

②private staric boolean greater(Comparable v,Comparable w);{//判断v是否大于w

        int result = v.compareTo(w);//当result>0,则v>m;当result=0,则v=m;当result,则v<m

        //return v.compareTo(w)>0;

        return false;

}

③private static void exch(Comparable[] a,int i,int j);{//交换a数组中,索引i和索引j处的值

        Comparable temp;

        temp = a[i];

        a[i]=a[j];

        a[j]=temp;

}

(5)元素比较次数:n^2/2-n/2;

(6)元素交换次数:n^2/2-n/2;

(7)总执行次数:(n^2/2-n/2)+(n^2/2-n/2)=n^2-n;

(8)按照大o的推导法则,保留函数中的最高阶顶那么最终冒泡排序的时间复杂度为O(n^2).

(9)适用场景:数据较少时

package guanqiawu;

import java.util.Arrays;

public class maopao {
    public static void main(String[] args){
        int []a={8,6,10,9,5,7};
        for(int i=0;i<a.length-1;i++){//i=0时选出最大的放在最后;i=1时选择第二大的放在最后以此类推
            for(int j=0;j<a.length-i-1;j++){//选出最大的元素
                if(a[j]>a[j+1]){
                    int temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(a));
    }
}

注意:Arrays.toString(数组名)是将数组转换成String类型输出

3.选择排序:

(1)原理:每一次遍历中,都假定第一个索引处的元素是最小值,和其他索引处的值依次比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引处的值为最小值,最后找到最小值所在的索引;  交换第一个索引处和最小值所在的索引处的值

(简单说就是先找出元素中索引的最小元素,然后与第一个开始索引的值交换位置;其后面的索引次数减一)

(2)类名:Selection

(3)构造方法:Selection():创建Selection对象

(4)成员方法:

①public static void sort(Comparable[] a):对数组内的元素进行排序

        for(int i=0;i<=a.length-2;i++){

                //定义一个变量,记录最小元素所在的索引,默认为参与选择排序的第一个元素所在的位置

                int min=i;

                for(int j=i+1;j<a.length;j++){

                        //需要比较最小索引min处的值与j索引处的值

                        if(greater(a[min],a[j])){

                                min=j;

                        }

              }

                exch(a,i,min);//交换最小元素索引min处的值和j索引处的值

        }

}

②public static boolean greater(Comparable v,Comparable w):判断v是否大于w

  int result = v.compareTo(w);//当result>0,则v>m;当result=0,则v=m;当result,则v<m

        //return v.compareTo(w)>0;

        return false;

}

③private static void exch(Comparable[] a,int i,int j):交换a数组中,索引i和索引j处的值

Comparable temp;

        temp = a[i];

        a[i]=a[j];

        a[j]=temp;

}

package guanqiawu;

import java.util.Arrays;

public class xuanze {
    public static void main(String[] args) {
        int[]b={12,6,8,9,10,32,45,0,1,4};
        int a=0;
        for(int i=0;i<b.length-1;i++){
            for(int j=i+1;j<b.length;j++){
                if(b[i]>b[j]){
                    a=j;
                }else{
                    continue;
                }
                int min=b[i];
                b[i]=b[a];
                b[a]=min;
            }
        }
       /* System.out.println(Arrays.toString(b));
        for(int i=0;i<b.length-1;i++){
            if(b[i]>b[i+1]){
                a=i+1;
            }
            int min=b[a];
            b[a]=b[i];
            b[i]=min;
        }
        System.out.println(Arrays.toString(b));*/
    }
}

//for循环的嵌套使用,外层完成了数据交换,内层循环完成了数据比较

(5)比较次数:n^2/2-n/2;

(6)数据交换次数:n-1

(7)时间复杂度:n^2/2-n/2+(n-1)=n^2/2+n/2-1;

根据大O推导法则,保留最高阶顶,去除常数因子,时间复杂度为O(n^2)

4.插入排序:

(1)原理:把所有元素分为两组,已经排序和未排序的;找到未排序的组中的第一个元素,向已经排序的组中进行插入;倒序遍历已经排序的元素,依次和插入的元素进行比较,直到找到一个元素小于等于待插入的元素,那么就把待插入的元素放到这个位置,其他的元素向后移动一位。

(2)类名:Insertion

(3)构造方法:Insertion();创建Insertion对象

(4)成员方法:

①public static void sort(Comparable[] a):对数组内的元素进行排序

        for(int i=1;i<a.length;i++){

                for(int j=1;j>0;j--){//比较j索引处的值和j-1处的值,如果索引j-1处的值比索引j处的值大,则交换数据,如果不大,那么就找到了合适的位置,退出循环即可;

                           if (greater(a[j-1],a[j])){
                                   exch(a,j-1,j);

                         }else{

                                break;

                        }

               }         

        }

②public static boolean greater(Comparable v,Comparable w):判断v是否大于w

int result = v.compareTo(w);//当result>0,则v>m;当result=0,则v=m;当result,则v<m

        //return v.compareTo(w)>0;

        return false;

}

③private static void exch(Comparable[] a,int i,int j):交换a数组中,索引i和索引j处的值

Comparable temp;

        temp = a[i];

        a[i]=a[j];

        a[j]=temp;

}

(5)比较次数:n^2/2-n/2;

(6)数据交换次数:n^2/2-n/2;

(7)时间复杂度:(n^2/2-n/2)+(n^2/2-n/2;)=n^2-n;

根据大O推导法则,保留最高阶顶,去除常数因子,时间复杂度为O(n^2)

package guanqiawu;

import java.util.Arrays;

public class charu {
    public static void main(String[] args) {
        int[]a={21,3,1,23,2,5,65,10,86,15,7};
        for(int i=1;i<a.length;i++){
            int b=a[i];
            while (i-1>=0&&b<=a[i-1]){
                a[i]=a[i-1];
                i--;
            }
            a[i]=b;
           /* if(a[i]<=a[i-1]){
                int j=0;
                for( j=i;j>=0;j--){
                    a[j]=a[i-1];
                }
                a[j]=b;
            }*/
        }
        System.out.println(Arrays.toString(a));
    }
}

5.快速排序:

(1)原理:

①先从元素中取出一个数作为基准;

②分区:将比基准数大的放在右边,小于等于基准数的放大左边;

③在对左右两边的区中的数重复第二步,直到各个区间只有一个数

注意:一般默认的基准数是在最左边,所以首先从右边开始比较,如果当前arr[right]比基准数大,则直接将右指针左移一位,当然还要保证left<right

package guanqiawu;
import java.util.Arrays;
public class kuaisu {
        /**
         * 分区过程
         * a[] 待分区数组
         *  left 待分区数组最小下标
         *  right 待分区数组最大下标
         */
        public static void kuaisu(int[] a,int left,int right) {
            if(left<right) {
                int temp=qSort(a,left,right);
                kuaisu (a,left,temp-1);
                kuaisu (a,temp+1,right);
            }
        }
        /**
         * 排序过程
         *  a 待排序数组
         *  left 待排序数组最小下标
         *  right 待排序数组最大下标
         * @return 排好序之后基准数的位置下标,方便下次的分区
         */
        public static int qSort(int[] a,int left,int right) {
            int temp=a[left];//定义基准数,默认为数组的第一个元素
            while(left<right) {//循环执行的条件
                //因为默认的基准数是在最左边,所以首先从右边开始比较进入while循环的判断条件
                //如果当前arr[right]比基准数大,则直接将右指针左移一位,当然还要保证left<right
                while(left<right && a[right]>temp) {
                    right--;
                }
                //跳出循环说明当前的arr[right]比基准数要小,那么直接将当前数移动到基准数所在的位置,并且左指针向右移一位(left++)
                //这时当前数(arr[right])所在的位置空出,需要从左边找一个比基准数大的数来填充。
                if(left<right) {
                    a[left++]=a[right];
                }
                //下面的步骤是为了在左边找到比基准数大的数填充到right的位置。
                //因为现在需要填充的位置在右边,所以左边的指针移动,如果arr[left]小于或者等于基准数,则直接将左指针右移一位
                while(left<right && a[left]<=temp) {
                    left++;
                }
                //跳出上一个循环说明当前的arr[left]的值大于基准数,需要将该值填充到右边空出的位置,然后当前位置空出。
                if(left<right) {
                    a[right--]=a[left];
                }
            }
            //当循环结束说明左指针和右指针已经相遇。并且相遇的位置是一个空出的位置,
            //这时候将基准数填入该位置,并返回该位置的下标,为分区做准备。
            a[left]=temp;
            return left;
        }
        public static void main(String[] args) {
            int[] a= {72,6,57,88,60,42,83,73,48,85};
            kuaisu (a,0,9);
            System.out.println(Arrays.toString(a));
        }


}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值