输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。用堆排序来做。 1 class Solution { 2 public: 3 vector GetLeastNumbers_Solution(vector input, ...
分类:
其他好文 时间:
2015-08-31 21:28:54
阅读次数:
156
题目:
一个整形数组里除了一个数字出现3次以外,其他数字都出现2次.请写程序找出这个出现3次的数字.
要求使用辅助空间O1,时间复杂度Onlogn.
1.使用堆排序.(堆排序的时间复杂度为Onlogn)
因为堆排序每次取到的都是最大(或是最小)的数字,三个相同的数字肯定是紧挨着被取出的.
所以在原先的堆排序算法上,加2个标记记录即可.
代码:
// 使用堆排序,每次取...
分类:
编程语言 时间:
2015-08-31 13:35:12
阅读次数:
200
选择排序也是比较简单的一种排序方法,这是内部排序的一种,实现的思路非常简单。
内部排序:指表的规模足够小,能够全部放在内存中进行排序的方法。(插入排序、快速排序、堆排序、归并排序、基数排序等)。
外部排序:指被排序的数据信息规模太大,不能全部放入内存时,文件必须分段装入内存,直到整个文件被排号序为止。...
分类:
编程语言 时间:
2015-08-30 06:38:48
阅读次数:
169
# 堆排序的Python实现# coding:utf-8import randomimport timet = time.time()# 堆排序, 按照从小到大排序,所以建立大根堆# 列表的第一个元素没有使用def ShiftDown(a, i): if not a: retur...
分类:
编程语言 时间:
2015-08-30 00:46:04
阅读次数:
339
冒泡排序:O(N^2)。输入对结果没有影响。
插入排序:最差O(N^2),最优O(N),平均O(N^2)。输入有影响,例如已排好序,则为O(N)。
选择排序:最差,最优,平均都是O(N^2)。输入对结果没有影响。
希尔排序:最差为o(Nlg^2N)。缩小增量排序。关键是如何选取这个增量序列。(一般,但不够好的选择是 k/2)。
堆排序:最差,最优,平均都是O(NlgN)。堆排序是所有下界排...
分类:
编程语言 时间:
2015-08-29 21:45:53
阅读次数:
192
该题最直观的解决思路是先对数组进行排序,然后返回第k个元素即可,但是该方法的时间复杂度为 O(nlog(n)), 较高。比较高校的思路有两种:一种是堆排序的思路,一种是快拍的思路。
一、堆排序的思路。该思路设置容量为 k 的大顶堆,将剩余的元素每一个和堆顶元素进行比较,若比堆顶元素大则该元素必然不会是第 k 大的元素,直接处理下一个元素;若比...
分类:
其他好文 时间:
2015-08-29 17:04:59
阅读次数:
126
堆是一种非常有用的数据结构,可用来设计高效的排序算法和优先队列。一个堆是一颗具有如下性质的二叉树:1)它是一颗完全二叉树;2)每个节点都大于等于其任何子节点。
如上图是一个最大堆,我们可以用数组来描述它。根节点在数组位置0,两个孩子在位置1和2。对于位于位置i的节点,其左孩子在2i+1,其右孩子在2i+2,其父节点在(i-1)/2。利用堆进行排序,是堆一个很重要的用途。下面是堆排序的代码...
分类:
编程语言 时间:
2015-08-27 18:52:16
阅读次数:
145
1、堆建立首先观察一个堆的向下调整过程。由于不满足最大堆的条件,对于不满足的元素,选择子节点中的最大元素交换。并更新被交换的子节点作为当前节点,继续调整,直至成为叶节点或满足最大堆的条件。 1 #define left(i) (2*i+1) 2 #define right(i) 2*(i+1) 3 ...
分类:
编程语言 时间:
2015-08-26 19:23:42
阅读次数:
129
堆排序的思想堆排序的具体算法,思想是每次取出堆的最顶层根节点,即数组下标为0,然后与最后一个节点即i+1交换。
参考地址建堆过程:
首先将原始队列构建成完全二叉树
然后从第一个非叶子节点开始,比较当前节点和其孩子节点,将最大的元素放在当前节点,交换当前节点和最大节点元素。
注意:如果根节点是a[0],那么第一个非叶子节点就是倒数第二层的最后一个根节点,下标为length/2-1
将当前元素前面所...
分类:
编程语言 时间:
2015-08-26 15:48:18
阅读次数:
143