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

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

问题一:

什么是线性和非线性;

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

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

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

详解:

一.线性结构

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个数

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

  1. /**
  2. * 插入排序法
  3. *
  4. * @param datas
  5. */
  6. public static int[] sortInsert(int[] datas) {
  7. for (int i = 1; i < datas.length; i++) {
  8. int j = i - 1;
  9. AlgorithmUtil.temp = datas[i];
  10. for (; j >= 0 && AlgorithmUtil.temp < datas[j]; j--) {
  11. datas[j + 1] = datas[j];
  12. }
  13. datas[j + 1] = AlgorithmUtil.temp;
  14. }
  15. return datas;
  16. }

2.简单选择排序

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

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

个数比较为止。

  1. /**
  2. * 选择排序
  3. *
  4. * @return
  5. */
  6. public static int[] sortSelect(int[] datas) {
  7. for (int i = 0; i < datas.length; i++) {
  8. int index = i;
  9. for (int j = i + 1; j < datas.length; j++) {
  10. if (datas[j] < datas[index])
  11. index = j;
  12. }
  13. if (i != index)
  14. AlgorithmUtil.swap(datas, i, index);
  15. }
  16. return datas;
  17. }

3.冒泡排序

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

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

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

  1. /**
  2. * 冒泡排序
  3. *
  4. * @return
  5. */
  6. public static int[] sortBubble(int[] datas) {
  7. for (int i = 0; i < datas.length - 1; i++) {
  8. for (int j = 0; j < datas.length - 1 - i; j++) {
  9. if (datas[j] > datas[j + 1])
  10. AlgorithmUtil.swap(datas, j, j + 1);
  11. }
  12. }
  13. return datas;
  14. }

4.快速排序

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

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

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

  1. /**
  2. * 快速排序;分割数组
  3. *
  4. * @param datas
  5. */
  6. public static int QuickPartition(int[] datas, int left, int right) {
  7. int pivot = datas[left];
  8. while (left < right) {
  9. while (left < right && datas[right] >= pivot)
  10. --right;
  11. datas[left] = datas[right]; // 将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上
  12. while (left < right && datas[left] <= pivot)
  13. ++left;
  14. datas[right] = datas[left]; // 将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上
  15. }
  16. datas[left] = pivot; // 当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上
  17. return left;
  18. }
  19.  
  20. /**
  21. * 快速排序;递归返回数组
  22. *
  23. * @param datas
  24. */
  25. public static int[] sortQuick(int[] datas, int left, int right) {
  26. if (left < right) {
  27. int data = QuickPartition(datas, left, right);
  28. sortQuick(datas, left, data - 1);
  29. sortQuick(datas, data + 1, right);
  30. }
  31. return datas;
  32. }

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

  1. public class AlgorithmUtil {
  2.  
  3. public static int temp,index = 0;
  4.  
  5. /**
  6. * 临时值交换
  7. *
  8. * @param datas
  9. * 数组
  10. * @param i
  11. * @param j
  12. */
  13. public static void swap(int[] datas, int i, int j) {
  14. temp = datas[i];
  15. datas[i] = datas[j];
  16. datas[j] = temp;
  17. }
  18.  
  19. /**
  20. * 扩充数组长度
  21. *
  22. * @param datas
  23. * @param value
  24. * @return
  25. */
  26. public static int[] expandArray(int[] datas, int value) {
  27. if (datas.length <= index) {
  28. int[] arrays = new int[datas.length * 2];
  29. System.arraycopy(datas, 0, arrays, 0, datas.length);
  30. datas = arrays;
  31. }
  32. datas[index] = value;
  33. index++;
  34. return datas;
  35. }
  36. }

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

浅谈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. Javascript模块化编程(二):AMD规范(转)

    这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...

  2. command for ContextMenu in DataTemplate

    准备教程. 1. 无难度方式 <DataTemplate x:Key="DataTemplate1"> <StackPanel  > <toolkit ...

  3. 尝试解答java内存问题

    在园子中看见了这个园友的问题,高手指点一下,关于编写Java程序让Jvm崩溃,恰巧这两天看了点相关的东西,也尝试了一下,下面是仁兄提出的第一个疑问,我来复现一下: package jvm; publi ...

  4. virtualenv 环境安装

      # Python 2.7.6:wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tar.xztar xf Python-2.7.6.tar. ...

  5. python 常用的模块(base64)转

    Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...

  6. 完全分布式安装hadoop

    以三个节点为例的服务器集群来安装和配置hadoop 以下是各服务器ip地址和对应所做的节点 192.168.61.128 master 192.168.61.129 slave1 192.168.61 ...

  7. Centos 7 联想Y430P无线网卡驱动安装 过程参考

    Centos 7  联想Y430P无线网卡驱动安装 过程参考 ABRT 已检测到 [root@endv ~]# yum install -y rdesktop 已加载插件:fastestmirror, ...

  8. ionic准备之angular基础——格式化数据以及过滤器(8)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 标准库Stack的一种实现

    本文实现了STL中stack的大部分功能,同时添加了一些功能. 注意以下几点: 1.Stack是一种适配器,底层以vector.list.deque等实现 2.Stack不含有迭代器 在本例中,我添加 ...

  10. 最小化JavaScript代码

    1.去除不必要的格式符.空白符.凝视符. 这个操作.事实上能够理解为是一种格式化.尽管它操作的结果事实上是去除掉原始文件的那些格式. 2.模糊(Obfuscation)处理JAVASCRIP脚本源码. ...