import java.util.Random;
public class Sorts {
private int heapsize = 0;
Sorts(int[] a){
heapsize = a.length-1;
}
int parent(int i){
return (i+1)/2-1;
}
int left(int i){
return 2*(i+1)-1;
}
int right(int i){
return 2*(i+1);
}
//最大堆
void max_heap(int[] a, int i){
int l =left(i)-1;
int r = right(i)-1;
int largest = i;
if (l<=heapsize&&a[i]<a[l]) {
largest = l;
}else {
largest = i;
}
if (r<=heapsize&&a[r]>a[largest]) {
largest = r;
}
if (largest!=i) {
a[i]=a[i]+a[largest];
a[largest]=a[i]-a[largest];
a[i]=a[i]-a[largest];
max_heap(a, largest);
}
}
//建大根堆
void build_heap(int[] a){
for (int i = heapsize/2-1; i>=0; i--) {
max_heap(a, i);
}
}
//堆排序
void heapSort(int[] a){
build_heap(a);
for (int i = heapsize; i>0; i--) {
a[0]=a[0]+a[i];
a[i]=a[0]-a[i];
a[0]=a[0]-a[i];
heapsize--;
max_heap(a, 0);
}
}
//优先级队列提取最大值
int heapExtractMax(int[] a)throws Exception{
build_heap(a);
if (heapsize<0) {
throw new Exception("heap underflow");
}
int max = a[0];
a[0]=a[heapsize];
heapsize--;
max_heap(a, 0);
return max;
}
//提高关键字优先级
void heapIncreaseKey(int[] a, int i, int key)throws Exception{
if (key<a[i]) {
throw new Exception("new key is smaller then current key");
}
a[i] = key;
while (i>0&&a[parent(i)]<a[i]) {
a[i]= a[i]+a[parent(i)];
a[parent(i)]=a[i]-a[parent(i)];
a[i]=a[i]-a[parent(i)];
i=parent(i);
}
}
//插入关键字
void maxHeapInsert(int[] a, int key)throws Exception{
heapsize++;
a[heapsize]=Integer.MIN_VALUE;
heapIncreaseKey(a, heapsize, key);
}
public static void main(String[] args) {
int[] a = new int[10];
Random random = new Random(47);
for (int i = 0; i < a.length; i++) {
a[i]=random.nextInt();
}
for (int i : a) {
System.out.print(i+",");
}
System.out.println("-------------------------------------------");
Sorts sort = new Sorts(a);
// 测优先级队列 (和 堆排序 要分开来使用)
/*
try {
System.out.println(sort.heapExtractMax(a));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
sort.heapSort(a);//测试堆排序
System.out.println("-------------------------------------------");
for (int i : a) {
System.out.print(i+",");
}
}
}
分享到:
相关推荐
使用c++模板实现的堆排序、优先级队列,在vs2010下编译运行通过。压缩文件里为两个工程文件,如果有vs2010的话解压缩打开sln文件就可以了,没有的话,新建工程将文件复制过去就ok了。如果有问题可以留言。
小大根交替堆的实现可以使用数组或链表来存储元素,并使用堆排序算法来维护堆的性质。 在小大根交替堆实现的双端优先级队列中,插入和删除操作可以从队列的两端进行。插入操作可以将元素添加到队列的尾部或头部,而...
在C++标准库中,`<queue>`和`<priority_queue>`头文件提供了队列和优先级队列的实现,但这些是基于底层的动态数组(例如,`std::vector`)和堆排序算法。不过,如果我们要从零开始自己构建一个基于堆的优先级队列,...
与普通队列遵循“先进先出”(FIFO)原则不同,优先级队列依据元素的优先级进行出队操作,而不是按照它们被插入的顺序。优先级高的元素会优先被处理,这使得这种数据结构特别适合处理紧急任务或者高优先级的任务。 ...
总结来说,数据结构与算法中的优先级队列和堆排序在Python中可以通过不同的实现方法来达到高效的操作。优先级队列可以使用内置的`heapq`模块或者自定义的排序列表,而堆排序利用了堆数据结构的特性,能够在较短时间...
在Python中,可以使用内置的`heapq`模块来实现堆操作,包括插入元素(`heappush`)、弹出最大元素(`heappop`)以及构建堆(`heapify`)等,这些操作提供了高效且便捷的接口来处理优先级队列和堆排序问题。...
算法中优先级队列问题...用堆排序的算法来做的例子
优先级队列可以通过各种方式实现,如数组、链表、堆等。其中,堆是一种非常常用的数据结构,它可以高效地支持优先级队列的操作。 在堆中,每个节点都有一个关键码,用于确定节点的优先级关系。堆的根节点是整个堆的...
此外,可能还涉及到了排序算法,如堆排序,因为堆是实现优先级队列的一种高效方法。 通过分析这个毕业设计,学习者不仅可以掌握MATLAB编程技巧,还能深入理解优先级队列这一重要数据结构及其在实际问题中的应用。这...
这段代码可能涉及到数据结构如链表或优先级堆的实现,以及如何根据优先级对进程进行排序和调度的逻辑。 另一方面,"www.pudn.com.txt"可能是一个文本文件,提供了更多关于优先级队列调度的参考资料,比如可能包含...
在C++的标准模板库(STL)中,优先级队列是通过`priority_queue`类来实现的。 #### 二、优先级队列的定义与参数 优先级队列的定义通常采用以下形式: ```cpp priority_queue, Container, Functional> ``` - **Type*...
### 堆排序及优先队列的实现与应用 #### 一、堆排序的基本概念 堆排序是一种基于比较的排序算法,它利用堆这种数据结构的特性进行排序。堆可以分为大顶堆(Max Heap)和小顶堆(Min Heap)。在大顶堆中,任意节点...
对整个优先队列执行堆排序,首先从最后一个非叶子节点开始自底向上调整,构建小顶堆,然后将堆顶元素与末尾元素交换,删除堆顶元素,重复这个过程,直至整个队列有序。 7. `SSearchElem`和`SSearchWeigth`函数: ...
堆排序是一种基于比较的排序算法...`Heap.java`文件可能是实现堆排序或优先队列的一个Java源代码文件,可能包含了上述讨论的堆构造、插入、删除等相关方法。你可以通过阅读和理解这个文件来深入学习堆排序的实现细节。
总结来说,这个项目旨在通过实现和比较排序向量、未排序向量和堆形式的优先级队列,突出堆数据结构的优势。通过这种方式,学习者不仅可以掌握优先级队列的基本概念,还能了解到不同数据结构在实际问题中的优缺点。
1. **优先级队列结构**:该库的核心是优先级队列对象,它能够存储任意类型的数据,并根据用户定义的优先级规则进行排序。在Matlab中,这通常会通过实现自定义的比较函数来完成。 2. **插入操作**:向优先级队列插入...
Java中的优先级队列(PriorityQueue)是一种特殊的队列,它按照元素的优先级进行排序。在Java集合框架中,PriorityQueue是位于java.util包下的一个类,它实现了Queue接口,但并不保证按照先进先出(FIFO)的顺序进行...
优先级队列是一种特殊的数据结构,它按照元素的优先级进行排序,最高优先级的元素总是在队列的前端。在Python中,可以利用内置的`heapq`模块来实现优先级队列。本文将详细介绍如何使用Python创建一个优先级队列,并...
请注意,上述代码仅为演示目的,实际应用中可能会考虑性能优化,如使用更高效的优先级队列实现(如二叉堆或红黑树)以及减少不必要的排序操作。 在C#中,`System.Collections.Generic`命名空间提供了许多内置的排序...
《算法导论》系列读书笔记之六主要涵盖了优先级队列、堆排序以及大根堆和最大堆等重要概念。这些知识点在计算机科学与技术领域,尤其是数据结构和算法分析中占据着核心地位。下面将对这些内容进行深入的探讨。 ...