数据结构的基本概述:

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

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]+"\t");
}
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

												

数组其他部分及java常见排序的更多相关文章

  1. Java常见排序算法之Shell排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  2. java常见排序方法

    1.java常用排序方法 1) 选择排序         原理:a. 将数组中的每个元素,与第一个元素比较          如果这个元素小于第一个元素, 就将这个         两个元素交换.   ...

  3. Java常见排序算法之归并排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  4. Java常见排序算法之折半插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  5. Java常见排序算法之直接插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  6. Java常见排序算法之快速排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  7. Java常见排序算法之冒泡排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  8. Java常见排序算法之堆排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  9. Java常见排序算法之直接选择排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

随机推荐

  1. CentOS搭建VSFTP服务器

    一.安装vsftpd 1.查看是否已经安装vsftpd 2.如果没有,就安装 3.测试是否安装成功 4.安装成功设置开机启动 二.配置vsftpd 1.修改配置文件/etc/vsftpd/vsftpd ...

  2. 单例模式的N种写法

    单例模式算是设计模式中最容易理解,也是最容易手写代码的模式了吧.但是其中的坑却不少,所以也常作为面试题来考.本文主要对几种单例写法的整理,并分析其优缺点.很多都是一些老生常谈的问题,但如果你不知道如何 ...

  3. Java 8特性

    1. Java8的新特性 1.1. Lambda表达式和函数式接口 最简单的Lambda表达式可以用逗号分隔的参数列表.->符号和功能语句块来表示.示例如下: Arrays.asList( &q ...

  4. echo $[1 + 2] shell中 $[] 在bash中同$(()),用于算术计算

    shell脚本编写:echo $[ 11#8+1] 输出结果是几,为什么,怎么算来的?  摘自:https://zhidao.baidu.com/question/334766451.html   结 ...

  5. CentOS 7 升级内核 Kernel

    安装kernel 首先安装elrepo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.e ...

  6. C#通过Redis实现分布式锁

    Redis有三个最基本属性来保证分布式锁的有效实现: 安全性: 互斥,在任何时候,只有一个客户端能持有锁. 活跃性A:没有死锁,即使客户端在持有锁的时候崩溃,最后也会有其他客户端能获得锁,超时机制. ...

  7. c#范型

    泛型介绍:范型类和范型方法同事具备可重用性.类型安全和效率,这是非范型类和非范型方法无法具备的. 所谓范型,即通过参数化类型实现同一份代码上操作多种数据类型,范型编程是一种编程范式,它利用“参数化类型 ...

  8. 编写高质量代码改善C#程序的157个建议——建议88:并行并不总是速度更快

    建议88:并行并不总是速度更快 并行所带来的后台任务及任务的管理,都会带来一定的开销,如果一项工作本来就能很快完成,或者说循环体很小,那么并行的速度也许会比非并行要慢. 看这样一个例子,我们比较在同步 ...

  9. 编写高质量代码改善C#程序的157个建议——建议74:警惕线程的IsBackground

    建议74:警惕线程的IsBackground 在CLR中,线程分为前台线程和后台线程,即每个线程都有一个IsBackground属性.两者在表现形式上的唯一区别是:如果前台线程不退出,应用程序的进程就 ...

  10. MacOS VMware Function安装win的ghost系统(亲测成功!!!)

    1.下载WEPE工具生成可启动ISO 下载WEPE工具 WEPE工具下载地址 下载完成之后,双击打开文件(无需安装,可直接制作可启动ISO) 点击立即生成ISO之后 2.将生成的可启动ISO文件和wi ...