编程之美有一道考察多种排序的题目,题目如下:
有一个长度为N的无序数组,假定其中的每一个元素都各不相等,求其中最大的K个数。
作者对于此题目结合各种排序算法给出了五种解法思路。
解法一:
使用快速排序或堆排序对它们元素进行排序,整个排序的时间复杂度为O(N*log2{log}_2N),然后取出前K个,时间复杂度为O(K),总时间复杂度O(N*log2{log}_2N)+O(K)=O(N*l...
分类:
其他好文 时间:
2015-09-02 02:06:37
阅读次数:
277
快速排序每一趟比较用时O(n),要进行lgn次比较,才最终完成整个排序。所以快排的复杂度才为O(n*lgn)。而本节,我们要讲的是堆排序算法。据我所知,要真正彻底认识一个算法,最好是去查找此算法的原发明者的论文或相关文献。一、堆排序算法的基本特性时间复杂度:O(nlgn) //等同于归并排序最坏:O...
分类:
编程语言 时间:
2015-09-01 13:58:07
阅读次数:
194
一、概念堆排序是利用堆这种数据结构的性质设计的一种排序方式。堆是一个近似完全二叉树的结构,并满足性质:子节点的键值或则索引值总是小于等于(或则大于等于)父节点的。是不稳定排序。二、原理1.首先将待排序的数组进行堆化,构建成堆结构2.将堆首和堆尾进行交换3.将堆大小..
分类:
编程语言 时间:
2015-09-01 00:04:12
阅读次数:
265
输入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