堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树。 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2.每个结点的左子树 ...
分类:
编程语言 时间:
2017-08-20 11:21:09
阅读次数:
210
代码如下: 说明: 上面堆排序的关键在于buildMaxHeap()方法。该方法用于对data数组从0到lastindex索引范围内的元素建大顶堆,这样就选择出数组索引从0到lastindex范围内的最大元素。采用循环不断重复上面过程即可完成堆排序。 对于堆排序算法而言,假设有n项数据,需要进行n- ...
分类:
编程语言 时间:
2017-08-19 20:03:40
阅读次数:
182
一、概念 堆排序是简单选择排序的一种改进,改进的着眼点是:如何减少关键码的比较次数。 简单选择排序在一趟排序中仅选出最小关键码,没有把一趟比较结果保存下来,因而记录的比较次数较多。 堆排序在选出最小关键码的同时,也找出较小关键码,减少了在后面的选择中的比较次数,从而提高了整个排序的效率。 堆是具有下 ...
分类:
编程语言 时间:
2017-08-17 21:20:47
阅读次数:
117
堆排序是一种选择排序,其时间复杂度为O(nlogn)。 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。 情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆) 其中 ...
分类:
编程语言 时间:
2017-08-17 12:43:58
阅读次数:
172
package test; import java.util.Random; public class TSort { public static void main(String[] args) { TSort tsort = new TSort(); tsort.test(); } public... ...
分类:
编程语言 时间:
2017-08-16 21:44:17
阅读次数:
142
这几天有点抵触情绪,看过了快速排序,但是一点都不想写有点复杂的代码0 0拖到了今天终于写了前几天就应该自己写一下的堆排序,完全用C语言写的,下面把代码贴一下。很多地方写得并不好,不过已经经过了测试,可以正确运行。 建堆是最为关键的环节,可以说堆建好了才能开始进行排序。这里为了保持高效,建堆采用的是F ...
分类:
编程语言 时间:
2017-08-16 21:40:44
阅读次数:
106
第六章 堆排序 最小堆和最大堆:近似的完全二叉树 A[parent(i)]<=A[i]或者A[parent(i)]>=A[i] 建堆复杂度O(n) 排序O(nlgn) 实际应用中,快速排序一般优于堆排序。可用于优先队列等。 在一个包含n个元素的堆中,所有优先队列的操作均可在O(lgn)时间内完成。 ...
分类:
编程语言 时间:
2017-08-16 17:28:34
阅读次数:
145
8.1 排序算法的下界 定理8.1 在最坏情况下,任何比较排序算法都需要做Ω(nlgn)次比较。 推论8.2 堆排序和归并排序都是渐进最优的比较排序算法。 8.2 计数排序 计数排序假设n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数。当k=O(n)时,排序的运行时间为θ(n)。 ...
分类:
编程语言 时间:
2017-08-16 17:05:12
阅读次数:
128
分类: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序。 // 排序原始数据 p ...
分类:
编程语言 时间:
2017-08-14 11:39:13
阅读次数:
251
排序:对一序列对象依据某个keyword进行排序; 稳定:假设a原本在b前面。而a=b,排序之后a仍然在b的前面; 比如:插入排序、冒泡排序、归并排序、计数排序、基数排序、桶排序 不稳定:假设a原本在b的前面。而a=b。排序之后a可能会出如今b的后面。 比如:希尔排序、高速排序、选择排序、堆排序 内 ...
分类:
编程语言 时间:
2017-08-12 18:59:37
阅读次数:
130