• 数组其他部分及java常见排序


    数据结构的基本概述:

    数据结构是讲什么,其实大概就分为两点:

    1.数据与数据之间的逻辑关系:集合、一对一、一对多、多对多

    2.数据的存储结构:

    一对一的:线性表:顺序表(比如:数组)、链表、栈(先进后出)、队列(先进先出)

    一对多的:树形结构:二叉树等

    多对多的:图形结构

    数组中涉及到常见的算法:

    1.数组元素的赋值(杨辉三角、回行数等)

    2.求数值型数组中元素的最大值、最小值、平均数、总和等。

    3.数组的复制、反转、查找(线性查找、二分法查找)

    4.数组元素的排序算法。

    关于多维数组的经典题目之杨辉三角:

    public static void main(String[] args) {
        int [][] arr = new int[10][];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = new int[i+1];
            for (int j = 0; j < arr[i].length; j++) {
                if (j==0||j==arr[i].length-1){
                    arr[i][0] = arr[i][j] = 1;
                }else{
                    arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
                }
                System.out.print(arr[i][j]+"	");
            }
            System.out.println();
        }
    }

    插播一下关于生成一个随机数:

    Math.random()   //   [0.0,1)
    
    Math.random() * 90  //   [0.0,90.0)
    
    int(Math.random() * 90)  //   [0.0,89]
    
    int(Math.random() * 90 + 10)  //   [10,99]

    所以公式:获取【a,b】范围的随机数:(int)(Math.random()*(b-a+1))+a

    关于数组的复制值得一说的是:

    arry1 = arry2;//这个不是数值上的复制,而是把arry2的地址给了arry1,修改arry1的值,        
                          //arry2也会改变。           

    那么怎么只是单纯的复制数值呢?可以这样通过遍历赋值:

    int [] arry1 = new int[arry2.length];
    for (int i = 0; i<arry1.length;i++){
            arry1[i] = arry2[i];
    }

    数组的反转实现:

    方法一:

    for(int i = 0;i < arr.length / 2;i++ ){//这里除二,不管是奇数个或者偶数个数都一样,不    
                                                         //用加=,体会体会。
            String temp = arr[i];
            arr[i] = arr[arr.length - i - 1];
            arr[arr.length - i - 1] = temp;
    }        

    方法二:

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

    关于二分法需要注意:所要查找的数组必须是有序的。

    十大内部排序:

    选择排序:

    >直接选择排序、堆排序

    交换排序:

    >冒泡排序、快速排序

    插入排序:

    直接插入排序、折半插入排序、shell排序

    归并排序

    桶式排序

    基数排序

    冒泡排序代码:

    for (int i = 0; i <arr.length-1 ; i++) {
                for (int j = 0;j<arr.length-i-1;j++) {
                    if (arr[j] > arr[j+1]) {
                        int temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                    }
                }
            }

    快速排序:

    快速排序通常明显比同为O(nlogn)的其他算法更快,而且采用了分治法的思想,很重要。

    排序思想:

    1.从数列中挑选出一个元素,称为“基准”。

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

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

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

    这么多排序算法的性能怎么样呢?如下图:

     适用场景比较:  

      1.从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。

      2.从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法。对于Shell排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。

      3.从稳定性看:直接插入排序、冒泡排序和归并排序是稳定的;而直接选择排序、快速排序、Shell排序和堆排序是不稳定排序。

      4.从待排序的记录数n的大小看,n较小时,宜采用简单排序,当n较大时宜采用改进排序。


    java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法。
    1.Arrays.equals(arr1,arr2);判断两个数组是否相等:

        查看源码可以得知,其实这个判断呢它是先通过arr1==arr2判断地址是否相同,然后在判断长度是否相同,最后判断元素是否相同,当然地址相同直接跳出,长度不同直接跳出,元素遍历时有所不同,直接跳出。


    2.Arrays.tostring(arr1);

        查看源码其实就是通过stringbuilder一个一个拼接成字符串的。

    3.Arrays.fill(arr1,n);

        查看源码其实就是遍历赋值,把arr1的每个元素变成n。

    4.Arrays.sort(arr1);

        查看源码底层就是快排。

    5.Array.binarySearch(arr1,n);

        返回负数为没找到n,正数表示找到位置索引。

    数组中的常见异常:

    1.数组角标越界异常:ArrayIndexOutOfBoundsExcetion

    2.空指针异常:NullPointerException

    
    
  • 相关阅读:
    AngularJS
    Java
    Java
    AngularJS
    Java
    Java
    AngularJS
    Java
    Debian
    Java
  • 原文地址:https://www.cnblogs.com/liuhuan425/p/10747429.html
Copyright © 2020-2023  润新知