上一页 1 2 3 4 5 6 7 8 ··· 15 下一页
摘要: 一、简介 堆排序可以分为两个阶段:构造堆和下沉排序两个阶段。 构造堆:将原始数组重新组织为一个堆。 下沉排序:从堆中按递减顺序取出所有元素并得到排序结果。 二、实现 1、堆排序 中规中矩的方法: 从左向右遍历整个数组,用swim方法保证当前位置左侧的所有元素已经是堆有序的即可。 就像连续向优先队列中 阅读全文
posted @ 2017-04-20 15:20 我是老邱 阅读(1039) 评论(0) 推荐(0) 编辑
摘要: 一、简介 在很多应用中,允许用例对已经进入优先队列中的元素非常有必要。 一个简单的实现方法是对每个元素关联一个索引。 索引优先队列API: 二、实现 通过对普通优先队列的实现进行拓展来实现索引优先队列。 思路: (1)增加数组keys用来保存优先队列元素(item or key) (2)pq数组则改 阅读全文
posted @ 2017-04-19 21:53 我是老邱 阅读(1910) 评论(0) 推荐(0) 编辑
摘要: 一、优先队列 许多应用程序都需要处理有序的元素,但又不一定要求全部有序,或不要求一次就排序完成。 在这种情况下,一个合适的数据结构应该支持两种操作:删除最大元素和插入元素。这就是优先队列。 API: 优先队列最重要的操作就是删除最大元素和插入元素。 二、基础实现 1、数组实现(有序) 在insert 阅读全文
posted @ 2017-04-19 15:30 我是老邱 阅读(1593) 评论(0) 推荐(0) 编辑
摘要: 思路一: 1、先求出两个链表ListA,ListB的长度LengthA,LengthB。 2、然后先把长的链表头指针先往前走|LengthA - LengthB|步。 3、最后两个链表头指针同步往前走一步,直到指向的对象相同。 代码实现及测试用例: 思路2: 不用求出链表长度的值,但其实算法复杂度是 阅读全文
posted @ 2017-04-11 10:43 我是老邱 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 一、一定会相遇的证明 1、如果链表没有环,那么快指针比慢指针先到达尾部(null)。 2、如果链表有环的话,因为快指针走的比慢指针快,所以在环中相遇的过程可以看作是快指针从环后边追赶慢指针的过程。 用递归法证明,快慢指针一定会相遇: (1)快指针与慢指针之间差一步。此时继续往后走,慢指针前进一步,快 阅读全文
posted @ 2017-04-09 21:31 我是老邱 阅读(4141) 评论(0) 推荐(2) 编辑
摘要: 代码实现: 单元测试: 输出结果: 性能测试: 输出结果: 阅读全文
posted @ 2017-03-28 16:25 我是老邱 阅读(418) 评论(0) 推荐(0) 编辑
摘要: 关键代码: 测试用例: 输出结果: 红色部分可看到右子数组的最左元素可作为左子数组右边界的哨兵。 性能对比: 没有大区别。 阅读全文
posted @ 2017-03-28 14:20 我是老邱 阅读(547) 评论(0) 推荐(0) 编辑
摘要: 一、思路 快速排序是一种分治排序算法。快速排序先把数组重新整理分割两个子数组,然后对两个子数组进行排序。 快速排序和归并排序是互补的: 归并排序中,算法先将数组分为两个子数组进行排序,再将两个子数组进行归并成一个有序的数组。 快速排序中,算法先对数组进行重新整理分割成两个子数组,再对两个子数组进行排 阅读全文
posted @ 2017-03-27 23:52 我是老邱 阅读(10292) 评论(2) 推荐(0) 编辑
摘要: 在sort函数创建aux数组: 在merge函数创建aux数组: 性能对比: 阅读全文
posted @ 2017-03-26 11:39 我是老邱 阅读(259) 评论(0) 推荐(0) 编辑
摘要: package com.qiusongde; import edu.princeton.cs.algs4.In; import edu.princeton.cs.algs4.StdOut; public class MergeNoStaticArray { public static void sort(Comparable[] input) { int N... 阅读全文
posted @ 2017-03-26 11:10 我是老邱 阅读(272) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 15 下一页