开发随手记-Java高级-数据结构

数组

特点:有序(插入顺序)、可重复、固定长度、增删慢、查找快。

适用场景:适用于查找或遍历操作的场景适用。

基于数组的集合:ArrayList(非线程安全)、Vector(线程安全)

链表

特点:有序(插入顺序)、可重复、无固定长度、增删快、查找慢。

适用场景:适用于对集合数据多新增或修改操作的场景。

基于链表的集合:LinkedList(非线程安全)。

链表的实现

单向链表

单链表就是链表中的某个节点(Node),只指向它的下一个节点

双向链表

双向链表就是链表中的某个节点,同时指向该节点的上一个下一个节点的信息

头节点:上一个节点信息为空。

尾节点:下一个节点信息为空。 

 

Java常见算法

递归

递归就是方法的自我调用,例如下图:

程序会一直输出hello,类似死循环。递归程序开始后,就会有N个say()的方法等待本方法内的say()方法执行完毕自己才结束。

注意事项

  1. 递归调用必须在某个条件下结束,否则就是死循环。
  2. 递归的层数不宜太多,否则可能会出现堆栈溢出。
  3. 构造方法不能递归调用。

阶乘

阶乘:5的阶乘就是 5 * 4 * 3 * 2 * 1

  1. 使用循环方式
  2. 使用递归方式
  3. 排序算法

    冒泡排序

    冒泡排序的特点是小数下沉大数上浮,类似看鱼吐气泡。

快速排序

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字(通常使用第一个或最后一个元素)均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

 

其它排序

排序算法有很多种,简单选择排序、二分查找排序、堆排序、快速排序等等。

http://www.codeceo.com/article/8-java-sort.html

 

稳定性指:数据量不管大小,算法的时间复杂度和空间复杂度是否变化。

表格中排序算法非特殊情况,快速排序性能最好。

查找算法

顺序查找

顺序查找顾名思义就是按照顺序依次查找。

二分查找

二分查找(Binary Search)也叫作折半查找。二分查找有两个要求:一个是数列有序(可利用排序算法进行排序,如冒泡、快排等),二是数列使用顺序存储结构(比如数组、集合)。

算法核心:将数据排序后,折半,并找到中间元素。如果目标值小于中间元素,就在左边的数据中在折半,选取新的中间元素,如果目标值还小于新的中间元素就继续折半。直到目标值等于中间值结束。

        

数据操作小技巧

去重

可以利用一些不可重复的数据结构完成,如Map、Set。

 

 

统计 

 

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序(QuickSort)是一种常用的排序算法,它的核心思想是通过一趟排序将待排序数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 以下是Java实现的快速排序代码: ```java public class QuickSort { public void quickSort(int[] nums, int left, int right) { if (left < right) { int pivotIndex = partition(nums, left, right); quickSort(nums, left, pivotIndex - 1); quickSort(nums, pivotIndex + 1, right); } } private int partition(int[] nums, int left, int right) { int pivot = nums[left]; int i = left + 1; int j = right; while (i <= j) { while (i <= j && nums[i] < pivot) { i++; } while (i <= j && nums[j] >= pivot) { j--; } if (i <= j) { swap(nums, i, j); } } swap(nums, left, j); return j; } private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } ``` 使用方法: ```java int[] nums = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}; QuickSort quickSort = new QuickSort(); quickSort.quickSort(nums, 0, nums.length - 1); System.out.println(Arrays.toString(nums)); ``` 输出结果: ```java [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] ``` 以上代码中,`quickSort` 方法是快速排序的主体,它接受一个待排序的整数数组、数组的左右边界作为参数。在方法中,我们首先判断左右边界是否交叉,如果没有交叉,我们就通过分区函数 `partition` 进行分治。对于分区函数 `partition` ,它接受一个待排序的整数数组、数组的左右边界作为参数,它的核心思想是通过两个指针 i 和 j 一起遍历数组,当 i 指向的数小于等于 pivot 时,i 向右移动,当 j 指向的数大于 pivot 时,j 向左移动,直到 i 和 j 相遇。在遍历的过程中,如果 i 指向的数大于 pivot 并且 j 指向的数小于等于 pivot ,我们就交换 i 和 j 指向的数。最后,我们将 pivot 与 j 指向的数交换,并返回 j 作为分割点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值