堆排序的时间效率与快速排序
相同,也为O(n * log n)。空间上没有使用多余的空间。
基于数组堆的相关定义算法见Heap 堆
排序基于以下假设:
如果一个节点的两个子堆是正确,可以通过下降trickleDown使得堆恢复正常。
一个无序数组的n/2~n的数字可以看成为没有子堆的正确的堆。
对从n/2-1 至 0的元素依次调用trickleDown,可以将一个无序数组组中成一个正确的堆
只有一个节点的堆是个正确的堆
移除总是移除最大的元素,且每次移除后数组的从后向前多增加自由位置,可以将刚移除的数据放入其中。
Node为辅助类,key表示排序关键字,value表示数据。为了简便没有采用标准的get,set
Heap中
构造函数根据给定的需要排序的数组构造。
sort方法:首先将数组变成一个正确的堆,然后将堆中的数据依次取出放回数组。
trickleDown:将数组中的指定位置元素下降至恰当的位置,以保证堆的正确性。
print,main:提供简单的测试。
class Node { //表示装数据的节点
private int key; //排序的关键字
private Object value; //数据
Node(int key, Object value) {
this.key = key;
this.value = value;
}
int key() { return key; }
Object value() { return value; }
}
class Heap {
private Node[] array; //序排序的数组
private int pos; //当前有效数据的个数
Heap(Node[] array) {
this.array = array; //装入要排序的数组
pos = array.length;
}
private Node remove() { //删除堆的顶
Node result = array[0];
array[0] = array[--pos]; //将最后一个元素提至堆定
trickleDown(0); //将堆顶下降为恰当位置
return result;
}
private void trickleDown(int index) {
Node top = array[index]; //存放要下降的数据
int left = getLeft(index); //得到左子的位置
int right = getRight(index); //得到右子的位置
int current; //当前可能要下降的位置
if(left < pos && right < pos) //左右子节点有效,当前的位置设置为左右子节点中小的那个
current = array[left].key() > array[right].key() ? left : right;
else if (left < pos) current = left; //如果左子节点有效,则当前位置设置为左子节点
else current = -1; //没有可以下降的位置
while(current != -1 && array[current].key() > top.key()) {//当前节点有效且大于要下降的数据
array[index] = array[current]; //将当前节点向上提升。
index = current; //重复以上过程
left = getLeft(index);
right = getRight(index);
if(left < pos && right < pos)
current = array[left].key() > array[right].key() ? left : right;
else if (left < pos) current = left;
else current = -1;
}
array[index] = top; //将暂存的数据放入恰当的位置
}
private int getParent(int index) {
return (index-1)/2;
}
private int getLeft(int index) {
return 2 * index + 1;
}
private int getRight(int index) {
return 2 * index + 2;
}
public void sort() {
for(int i=array.length/2 -1; i>=0; i--) {
trickleDown(i);
}
for(int i=array.length-1; i>=0;i--) array[i] = remove();
}
public static void main(String[] args) {
Node[] nodes = {new Node(50,"hello"),
new Node(20,"jason"),
new Node(60,"peter"),
new Node(50,"orange"),
new Node(30,"temp"),
new Node(40,"hello"),
new Node(90,"nasen"),
new Node(25,"kaka")};
Heap heap = new Heap(nodes);
heap.sort();
print(nodes);
}
private static void print(Node[] nodes) {
for(Node node: nodes)
System.out.println(node.key() + "-----" + node.value());
}
}
分享到:
相关推荐
堆排序----堆与堆排序10-从堆的定义可以看出,堆实质是满足如下性质的完全二叉树:二叉树中任一非叶子结点均小于(大于)它的孩子结点
堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法----堆排序(超详细)堆排序详细图解(通俗易懂)+排序算法...
但是,快速排序的实际执行时间却比堆排序更快,这是因为快速排序的 cache freundliness 比堆排序更好。 快速排序、堆排序和归并排序都是 O(nlogn) 的时间复杂度,但是它们的稳定性、辅助空间和 cache freundliness ...
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。在计算机科学中,堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序有两种...
常用的排序算法--堆排序,通过创建堆的方法进行排序
本主题主要探讨了三种经典的排序算法——希尔排序、快速排序和堆排序,并在Java语言环境下通过多线程实现,以充分利用系统资源,提升排序性能。 希尔排序是一种基于插入排序的算法,由Donald Shell于1959年提出。它...
堆排序--大顶堆排序 大顶堆排序是堆排序的一种,通过构建大顶堆来实现排序的过程。下面是对大顶堆排序的详细解释: 什么是大顶堆? 大顶堆是一种特殊的完全二叉树,它满足以下条件: * 对于每个非叶子节点,节点...
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。在计算机科学中,堆通常被理解为一个完全二叉树,其中每个父节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。堆排序分为...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
堆排序是一种基于比较的排序算法,它通过构建和维护一个最大堆或最小堆来实现排序。在C语言中,我们可以自定义函数来实现这个过程。下面是对标题和描述中涉及的堆排序知识点的详细说明: 1. **最大堆**:在堆排序中...
8. 堆排序(Heap Sort):堆排序利用了堆这种数据结构,构建一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,调整堆,再将末尾元素移除,重复这个过程。时间复杂度为O(n log n)。 这些排序算法的Swift实现提供...
堆排序是一种基于比较的排序算法,它通过构建一个大顶堆或小顶堆来实现排序。在计算机科学中,堆通常被理解为一种特殊的树形数据结构,满足堆的性质:父节点的值总是大于或等于(对于大顶堆)或小于或等于(对于小...
堆排序-flash演示 可自己输入数据............
快速排序和堆排序是两种非常重要的内部排序算法,在计算机科学中有着广泛的应用。它们都是基于比较的排序方法,但各自有着独特的实现策略和性能特点。 快速排序由C.A.R. Hoare在1960年提出,其核心思想是分治法。...
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。在计算机科学中,堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序有两种...
堆排序是一种树形选择排序算法,它的基本思想是将待排序的数组构建成一个大根堆(或小根堆),然后将堆顶元素与堆底元素交换位置,再将剩余元素重新构建成堆,重复执行交换和重构堆的操作,直到整个数组有序。堆排序...
学习笔记
各种排序算法,包括希尔算法,快速排序,堆排序-A variety of sorting algorithms, including the Hill algorithm, quick sort, heap sort
Python 堆排序 堆排序 堆排序 堆排序 堆排序
本实验涉及了四种经典的内部排序算法:希尔排序、快速排序、堆排序和归并排序。 **希尔排序**(Shell Sort)是由希尔提出的,它是一种改进的插入排序。希尔排序的核心思想是将待排序的元素按照一定的间隔分组,对每...