浅谈Java数据结构和算法
今天的突然看集合底层的时候发现了好多算法和数据结构。再次就比较一下和汇总一下。
数据结构分类:线性结构和非线性结构
问题一:
什么是线性和非线性;
我个人的理解是:数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构;
线性结构包括:数组,链表,队列,栈;
非线性结构包括:树,图,表;
详解:
一.线性结构
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数据结构和算法的更多相关文章
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈JAVA集合框架
浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...
- 浅谈Java线程安全
浅谈Java线程安全 - - 2019-04-25 17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...
- 【转】浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...
- 浅谈Java中的hashcode方法(转)
原文链接:http://www.cnblogs.com/dolphin0520/p/3681042.html 浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...
随机推荐
- Javascript模块化编程(二):AMD规范(转)
这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...
- command for ContextMenu in DataTemplate
准备教程. 1. 无难度方式 <DataTemplate x:Key="DataTemplate1"> <StackPanel > <toolkit ...
- 尝试解答java内存问题
在园子中看见了这个园友的问题,高手指点一下,关于编写Java程序让Jvm崩溃,恰巧这两天看了点相关的东西,也尝试了一下,下面是仁兄提出的第一个疑问,我来复现一下: package jvm; publi ...
- 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. ...
- python 常用的模块(base64)转
Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...
- 完全分布式安装hadoop
以三个节点为例的服务器集群来安装和配置hadoop 以下是各服务器ip地址和对应所做的节点 192.168.61.128 master 192.168.61.129 slave1 192.168.61 ...
- Centos 7 联想Y430P无线网卡驱动安装 过程参考
Centos 7 联想Y430P无线网卡驱动安装 过程参考 ABRT 已检测到 [root@endv ~]# yum install -y rdesktop 已加载插件:fastestmirror, ...
- ionic准备之angular基础——格式化数据以及过滤器(8)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 标准库Stack的一种实现
本文实现了STL中stack的大部分功能,同时添加了一些功能. 注意以下几点: 1.Stack是一种适配器,底层以vector.list.deque等实现 2.Stack不含有迭代器 在本例中,我添加 ...
- 最小化JavaScript代码
1.去除不必要的格式符.空白符.凝视符. 这个操作.事实上能够理解为是一种格式化.尽管它操作的结果事实上是去除掉原始文件的那些格式. 2.模糊(Obfuscation)处理JAVASCRIP脚本源码. ...