Array小结(2)) 常见算法

92 阅读3分钟

常见array用法: 赋值、反转、扩容、缩容、查找、排序

数组赋值****

 

典例:杨辉三角

 

class YangHui{

    public static void main(String[] args){

        int[][] yanghui = new int [10][];

        for(int i=0;i<yanghui.length;i++){

            yanghui[i]=new int [i+1];

//因为i从0开始遍历,所以声明内部数组时需写作i+1

            yanghui [i][0]=1;

            yanghui [i][i]=1;            

//定义首尾数组元素

            for(int j=1;j<yanghui[i].length-1;j++){

//j从1开始遍历,第一行只有yanghui[0][0]=1一个元素,且尾元素已经定义为1,所以遍历条件为j<yanghui[i].length-1.

                yanghui [i][j]=yanghui [i-1][j]+yanghui[i-1][j-1];

 

            }

        }

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

            for(int j=0;j<yanghui[i].length;j++){

                System.out.print(yanghui[i][j]+"\t");

//遍历数组,显示杨辉三角的图形

            }

            System.out.println();

        }

    }

}

 

练习:定义一个数组,随机赋1-30以内的值,每个随机数各不相同。

 

public class RandomArray{

    public static void main(String[] args){

        int [] arr=new int [6];

        for(int i=0;i<arr.length;i++){

            arr[i] = (int)(Math.random()*30)+1;       //赋随机值

 

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

                if(arr[j]==arr[i]){

                    i--;

                    break;       //跳出当前的for循环,重新为arr[i]赋值

                }

            }

        }

        for(int i=0;i<arr.length;i++){

            System.out.println(arr[i]);  //遍历输出

        }

    }

    }

 

 

 

 

 

数组的反转、扩容、缩容****

3.1数组的反转Reverse

 

方法一:

class Reverse{

    public static void main(String[] args){

        int [] arr =new int []{1,2,3,4,5};   //static defination

        for(int i=0;i<arr.length/2;i++){

            int t=0;

            t=arr[i];

            arr[i]=arr[arr.length-1-i];

            arr[arr.length-1-i]=t;

            }          //exchange by intermediate variable

            for(int i=0;i<arr.length;i++){

                System.out.println("a["+i+"]="+arr[i]);

            }

    }

}

 

方法二:(前置省略)

       for(int i=0,j=arr.length-1;i<j;i++,j--){

        int t=arr[i];

        arr[i]=arr[j];

        arr[j]=t;

       }

        for(int i=0;i<arr.length;i++){

                System.out.println("a["+i+"]="+arr[i]);

            }

 

 

 

3.2 数组的扩容

(1)new新数组

(2)迁移数组元素

 

public class Enlarge{

    public static void main(String[] args){

        int [] arr = new int []{1,3,5,7,9};

        int [] newarr = new int [10];

        for(int i=0;i<arr.length;i++){

            int t=arr[i];

            arr[i]=newarr[i];

            newarr[i]=t;

        }

for(int i=0;i<newarr.length;i++){

    System.out.println("arr["+i+"]="+newarr[i]);

}

 

    }

}

 

 

3.3 数组的缩容

(题目为删除下标为2的数组元素)

public class Shorten{

    public static void main(String[] args){

        int []arr=new int []{2,4,6,8,10};

        int deleteindex = 2;

        int [] newarr = new int [arr.length-1];

for(int i=0;i<arr.length-1;i++){

    newarr[i]=arr[i];}

 

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

newarr[i-1]=arr[i];

}

arr=newarr;

       

        for(int i=0;i<arr.length;i++){

            System.out.println(arr[i]);

        }

 

 

 

 

 

 

 

 

 

 

 

数组的查找、冒泡排序、快速排序****

 

4.1查找

(1)顺序查找

class Array{

    public static void main(String[] args){

        int [] arr= {4,5,6,7,9};

int target =6;

boolean flag = true;

for(int i=0;i<arr.length;i++){

    if(target==arr[i]){

        System.out.println("the index is "+i);

        flag = false;

        break;

    }

}

    while(flag){

        System.out.println("there is not the number in this array.");

    }

    }

}

 

 

 

 

(2)二分查找(数组必须有序)

1.定义首索引head与尾索引end,mid=(head+end)/2

循环条件:head<=end;

循环方式;while(head<=end)

class Mid{

    public static void main(String[] args){

        int []arr={1,3,6,8,14,32,64,87};

        int head = 0;

        int end = arr.length-1;

        boolean flag = true;

        int target = 32;

            while(head<=end){

              int mid = (head+end)/2;

            if(arr[mid]==target){

                flag = false;

                System.out.println("The number is founded! Its index is "+ mid);

                break;

            }

            else if(arr[mid]<target){

                head=mid+1;

            }

            else

            {end = mid-1;}

            }

       

        if(flag){

            System.out.println("Sorry,I didn't find the target.");

        }

    }

}

 4.2 排序 (1)冒泡排序 class Bubbling{ public static void main(String[] args){ int []arr={33,55,66,37,45,29}; for(int i=0;i<arr.length;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ int t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; } } } for(int i=0;i<arr.length;i++){ System.out.println("arr["+i+"]="+arr[i]); } } }

(2)快速排序:

衡量排序算法的优劣:

时间复杂度、空间复杂度、稳定性

排序思想:

1. 从数列中挑出一个元素,称为"基准"(pivot),

2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

4. 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。