今天的突然看集合底层的时候发现了好多算法和数据结构。再次就比较一下和汇总一下。

数据结构分类:线性结构和非线性结构

问题一:

什么是线性和非线性;

我个人的理解是:数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构;

线性结构包括:数组,链表,队列,栈;

非线性结构包括:树,图,表;

详解:

一.线性结构

1.数组

特点:我们都知道数组中的元素在内存中连续存储的,可以根据是下标快速访问元素,因此,查询速度很快,然而插入和删除时,需要对元素移动空间,比较慢。

数组使用场景:频繁查询,很少增加和删除的情况。

2.链表

特点:元素可以不连续内存中,是以索引将数据联系起来的,当查询元素的时候需要从头开始查询,所以效率比较低,然而添加和删除的只需要修改索引就可以了

使用场景:少查询,需要频繁的插入或删除情况

3.队列

特点:先进先出,

使用场景:多线程阻塞队列管理非常有用

4.栈

特点:先进后出,就像一个箱子,

使用场景:实现递归以及表示式

5.数组与链表的区别

数组连续,链表不连续(从数据存储形式来说)

数组内存静态分配,链表动态分配

数组查询复杂度0(1),链表查询复杂度O(n)

数组添加或删除,复杂度o(n),链表添加删除,复杂度O(1)

数组从栈中分配内存。链表从堆中分配内存。

二。算法分类:

1)插入排序(直接插入排序、希尔排序)

2)交换排序(冒泡排序、快速排序)

3)选择排序(直接选择排序、堆排序)

4)归并排序

5)分配排序(基数排序)

所需辅助空间最多:归并排序

所需辅助空间最少:堆排序

平均速度最快:快速排序

不稳定:快速排序,希尔排序,堆排序。

1.直接插入排序

(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排

好顺序的,现在要把第n 个数插到前面的有序数中,使得这 n个数

也是排好顺序的。如此反复循环,直到全部排好顺序。

/**
* 插入排序法
*
* @param datas
*/
public static int[] sortInsert(int[] datas) {
for (int i = 1; i < datas.length; i++) {
int j = i - 1;
AlgorithmUtil.temp = datas[i];
for (; j >= 0 && AlgorithmUtil.temp < datas[j]; j--) {
datas[j + 1] = datas[j];
}
datas[j + 1] = AlgorithmUtil.temp;
}
return datas;
}

2.简单选择排序

(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;

然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一

个数比较为止。

 /**
* 选择排序
*
* @return
*/
public static int[] sortSelect(int[] datas) {
for (int i = 0; i < datas.length; i++) {
int index = i;
for (int j = i + 1; j < datas.length; j++) {
if (datas[j] < datas[index])
index = j;
}
if (i != index)
AlgorithmUtil.swap(datas, i, index);
}
return datas;
}

3.冒泡排序

(1)基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对

相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的

数比较后发现它们的排序与排序要求相反时,就将它们互换。

 /**
* 冒泡排序
*
* @return
*/
public static int[] sortBubble(int[] datas) {
for (int i = 0; i < datas.length - 1; i++) {
for (int j = 0; j < datas.length - 1 - i; j++) {
if (datas[j] > datas[j + 1])
AlgorithmUtil.swap(datas, j, j + 1);
}
}
return datas;
}

4.快速排序

(1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,

将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其

排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

  /**
* 快速排序;分割数组
*
* @param datas
*/
public static int QuickPartition(int[] datas, int left, int right) {
int pivot = datas[left];
while (left < right) {
while (left < right && datas[right] >= pivot)
--right;
datas[left] = datas[right]; // 将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上
while (left < right && datas[left] <= pivot)
++left;
datas[right] = datas[left]; // 将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上
}
datas[left] = pivot; // 当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上
return left;
} /**
* 快速排序;递归返回数组
*
* @param datas
*/
public static int[] sortQuick(int[] datas, int left, int right) {
if (left < right) {
int data = QuickPartition(datas, left, right);
sortQuick(datas, left, data - 1);
sortQuick(datas, data + 1, right);
}
return datas;
}

1.冒泡算法,2.选择算法,3.快速算法。4.插入算法,5.希尔算法,6.堆算法

public class AlgorithmUtil {  

public static int temp,index = 0;  

/**
* 临时值交换
*
* @param datas
* 数组
* @param i
* @param j
*/
public static void swap(int[] datas, int i, int j) {
temp = datas[i];
datas[i] = datas[j];
datas[j] = temp;
} /**
* 扩充数组长度
*
* @param datas
* @param value
* @return
*/
public static int[] expandArray(int[] datas, int value) {
if (datas.length <= index) {
int[] arrays = new int[datas.length * 2];
System.arraycopy(datas, 0, arrays, 0, datas.length);
datas = arrays;
}
datas[index] = value;
index++;
return datas;
}
}

目前记住。会冒泡。插入。选择。快速。算法。

浅谈Java数据结构和算法的更多相关文章

  1. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  2. 浅谈Java中set.map.List的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  3. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  4. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  5. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  6. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  7. 浅谈Java线程安全

    浅谈Java线程安全 - - 2019-04-25    17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...

  8. 【转】浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...

  9. 浅谈Java中的hashcode方法(转)

    原文链接:http://www.cnblogs.com/dolphin0520/p/3681042.html 浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...

随机推荐

  1. NDK安装教程 not a valid ndk directory -- Eclipse

    第一步:下载 Eclipse IDE for Java Developers http://www.eclipse.org/downloads/ 第二步:下载CDT http://www.eclips ...

  2. A Beginner’s Guide to the OUTPUT Clause in SQL Server

    原文 A Beginner’s Guide to the OUTPUT Clause in SQL Server T-SQL supports the OUTPUT clause after the ...

  3. The Art of Mocking

    One of the challenges developers face when writing unit tests is how to handle external dependencies ...

  4. 【log4j】springboot项目启动 ,使用的druid数据源,log4j报错 log4j:WARN Please initialize the log4j system properly.

    springboot项目启动 ,使用的druid数据源,log4j报错 -- :: --- [ restartedMain] o.hibernate.annotations.common.Versio ...

  5. 【java】在controller层使用的检查单一字段不能为null和检查属性中某些字段不能为null的工具

    ========================================================================================= 代码参考地址:Git ...

  6. ElasticSearch 结构化搜索全文

    1.介绍 上篇介绍了搜索结构化数据的简单应用示例,现在来探寻 全文搜索(full-text search) :怎样在全文字段中搜索到最相关的文档. 全文搜索两个最重要的方面是: 相关性(Relevan ...

  7. java源码阅读String

    1类签名与注释 public final class String implements java.io.Serializable, Comparable<String>, CharSeq ...

  8. 2017.6.29 java读取.properties配置文件的几种方法

    参考来自:http://www.cnblogs.com/s3189454231s/p/5626557.html 关于路径的解释:http://blog.csdn.net/bluishglc/artic ...

  9. 使用file_get_contents下载图片

        <?php /* 当你在搭建网站时,从远程服务器下载某张图片并且将其保存在自己的服务器上,这一操作会经常用到.代码如下: */ $image = file_get_contents('h ...

  10. Android 热修复使用Gradle Plugin1.5改造Nuwa插件

    随着谷歌的Gradle插件版本号的不断升级,Gradle插件如今最新的已经到了2.1.0-beta1,相应的依赖为com.android.tools.build:gradle:2.0.0-beta6, ...