浅谈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;
    }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java基础系列课程 ppt 和 源码 Java数据结构算法第七讲.avi Java数据结构算法第三十一讲.avi Java数据结构算法第三十七讲.avi Java数据结构算法第三十三讲.avi Java数据结构算法第三十九讲.avi Java数据结构算法第三十二讲.avi Java数据结构算法第三十五讲.avi Java数据结构算法第三十八讲.avi Java数据结构算法第三十六讲.avi Java数据结构算法第三十四讲.avi Java数据结构算法第三十讲.avi Java数据结构算法第九讲.avi Java数据结构算法第二十一讲.avi Java数据结构算法第二十七讲.avi Java数据结构算法第二十三讲.avi Java数据结构算法第二十九讲.avi Java数据结构算法第二十二讲.avi Java数据结构算法第二十五讲.avi Java数据结构算法第二十八讲.avi Java数据结构算法第二十六讲.avi Java数据结构算法第二十四讲.avi Java数据结构算法第二十讲.avi Java数据结构算法第八讲.avi Java数据结构算法第六讲.avi Java数据结构算法第十一讲.avi Java数据结构算法第十七讲.avi Java数据结构算法第十三讲.avi Java数据结构算法第十九讲.avi Java数据结构算法第十二讲.avi Java数据结构算法第十五讲.avi Java数据结构算法第十八讲.avi Java数据结构算法第十六讲.avi Java数据结构算法第十四讲.avi Java数据结构算法第十讲.avi Java数据结构算法第四十一讲.avi Java数据结构算法第四十三讲.avi Java数据结构算法第四十二讲.avi Java数据结构算法第四十四讲.avi Java数据结构算法第四十讲.avi 第一讲.exe 第三讲.exe 第二讲.exe 第五讲.exe 第四讲.exe
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构算法支撑。2.网上数据结构算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构算法, 除常用数据结构算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构算法。教程内容:本教程是使用Java来讲解数据结构算法,考虑到数据结构算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构算法的实现机制,开阔编程思路,提高优化程序的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值