优先队列之堆排序

1、最大堆

import java.util.Scanner ;

public class MaxPQ<Key extends Comparable<Key>>{
	private int N = 0 ;
	private Key[] pq ; 

	public MaxPQ(int max){
		pq = (Key[])new Comparable[max+1] ;
	}

	public MaxPQ(Key[] a){
		pq = (Key[])new Comparable[a.length+1] ;
		for (int i=0;i<a.length;i++) {
			insert(a[i]) ;
		}
	}

	public void insert(Key v){
		N++ ;
		pq[N] = v ;
		swim(N) ;
	}
	private void swim(int k){
		if(k>1){
			if(less(k/2,k)){
				exch(k,k/2) ;
				swim(k/2) ;
			}else{
				return ;
			}
		}else{
			return ;
		}
	}
	private boolean less(int i,int j){
		return pq[i].compareTo(pq[j])<0 ;
	}
	private void exch(int i, int j){
		Key t = pq[i] ;
		pq[i] = pq[j] ;
		pq[j] = t ;
	}

	public Key max(){
		return pq[1] ;
	}

	public Key delMax(){
		Key max = pq[1] ;
		pq[1] = pq[N] ;
		N-- ;
		pq[N+1] = null ;
		sink(1) ;
		return max ;
	}
	private void sink(int k){
		if(2*k<=N){
			int t = k ;
			if(less(t,2*k)) {
				t = 2*k ;
			}
			if(2*k+1<=N && less(t,2*k+1)){
				t = 2*k+1 ;
			}
			if(t!=k){
				exch(t,k) ;
				sink(t) ;
			}else{
				return ;
			}
		}else{
			return ;
		}
	}

	public boolean isEmpty(){
		return N == 0 ;
	}

	public int size(){
		return N ;
	}

	public static void main(String[] args) {
		System.out.println("please input the lenghth of heap: ") ;
		Scanner sc = new Scanner(System.in) ;
		int len = sc.nextInt() ;
		MaxPQ<Integer> pq = new MaxPQ<Integer>(len) ;
		System.out.println("please input the items:") ;

		for(int i=0;i<len;i++){
			pq.insert(sc.nextInt()) ;
		}

		for (int i=0;i<len;i++) {
		 	System.out.print(pq.delMax() + " ") ;
		}
	}
}

  

2、最小堆

import java.util.Scanner ;

public class MinPQ<Key extends Comparable<Key>>{
	private int N = 0 ;
	private Key[] pq ; 

	public MinPQ(int max){
		pq = (Key[])new Comparable[max+1] ;
	}

	public MinPQ(Key[] a){
		pq = (Key[])new Comparable[a.length+1] ;
		for (int i=0;i<a.length;i++) {
			insert(a[i]) ;
		}
	}

	public void insert(Key v){
		N++ ;
		pq[N] = v ;
		swim(N) ;
	}
	private void swim(int k){
		if(k>1){
			if(less(k,k/2)){
				exch(k,k/2) ;
				swim(k/2) ;
			}else{
				return ;
			}
		}else{
			return ;
		}
	}
	private boolean less(int i,int j){
		return pq[i].compareTo(pq[j])<0 ;
	}
	private void exch(int i, int j){
		Key t = pq[i] ;
		pq[i] = pq[j] ;
		pq[j] = t ;
	}

	public Key min(){
		return pq[1] ;
	}

	public Key delMin(){
		Key max = pq[1] ;
		pq[1] = pq[N] ;
		N-- ;
		pq[N+1] = null ;
		sink(1) ;
		return max ;
	}
	private void sink(int k){
		if(2*k<=N){
			int t = k ;
			if(less(2*k,t)) {
				t = 2*k ;
			}
			if(2*k+1<=N && less(2*k+1,t)){
				t = 2*k+1 ;
			}
			if(t!=k){
				exch(t,k) ;
				sink(t) ;
			}else{
				return ;
			}
		}else{
			return ;
		}
	}

	public boolean isEmpty(){
		return N == 0 ;
	}

	public int size(){
		return N ;
	}

	public static void main(String[] args) {
		//System.out.println("please input the lenghth of heap: ") ;
		//Scanner sc = new Scanner(System.in) ;
		//int len = sc.nextInt() ;
		//MinPQ<Integer> pq = new MinPQ<Integer>(len) ;
		//System.out.println("please input the items:") ;
		//int len = sc.nextInt() ;

		//for(int i=0;i<len;i++){
		//	pq.insert(sc.nextInt()) ;
		//}

		Integer[] a = {10,9,8,7,6,5,4,3,2,1} ;
		MinPQ<Integer> pq = new MinPQ<Integer>(a) ;
		for (int i=0;i<a.length;i++) {
		 	System.out.print(pq.delMin() + " ") ;
		}
	}
}

  

3、堆排序

import java.util.Scanner ;

public class HeapSort{
	public static void heapSort(Comparable[] a){
		int N = a.length-1 ;
		for(int i=N/2;i>=1;i--){     //for循环构造了最大堆;
			sink(a,i,N) ;
		}

		while(N>1){                  //while循环完成了从小到大排序
			exch(a,1,N) ;
			N-- ;
			sink(a,1,N) ;
		}
	}

	private static void sink(Comparable[] a, int i, int j){
		if(2*i<=j){
			int t = i ;
			if(less(a[t],a[2*i])){
				t = 2*i ;
			}
			if(2*i+1<=j && less(a[t],a[2*i+1])){
				t = 2*i+1 ;
			}
			if(t!=i){
				exch(a,t,i) ;
				sink(a,t,j) ;
			}else{
				return ;
			}
		}else{
			return ;
		}
	}

	private static boolean less(Comparable v, Comparable w){
		return v.compareTo(w)<0 ;
	}

	private static void exch(Comparable[] a, int i, int j){
		Comparable temp = a[i] ;
		a[i] = a[j] ;
		a[j] = temp ;
	}

	private static void show(Comparable[] a){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i] + " ") ;
		}
		System.out.println() ;
	}

	public static boolean isSorted(Comparable[] a){
		for(int i=2;i<a.length;i++){
			if(less(a[i],a[i-1])){
				return false ;
			}
		}
		return true ;
	}

	public static void main(String[] args){

		System.out.println("please input the length of array:") ;

		Scanner sc = new Scanner(System.in) ;
		int len = sc.nextInt() ;
		Integer[] a = new Integer[len] ;

		System.out.println("please input the numbers of array:") ;
		for (int i=0;i<len;i++) {
			a[i] = sc.nextInt() ;
		}

		if (!isSorted(a)) {
			heapSort(a) ;
		}

		show(a) ;
	}
}

  

时间: 2024-12-28 14:01:11

优先队列之堆排序的相关文章

算法2.4——优先队列与堆排序

优先队列(Priority Queues)的使用和队列(删除最老的元素)以及栈(删除最新的元素)类似.举个实用例子:也就是从10亿个元素中选出最大的10个,有了优先队列,就只需要用一个能存储10个元素的队列即可. 而二叉堆很好实现优先队列的基本操作.其中二叉堆是一组能够用队友徐的完全二叉树排序的元素.其中关于堆的算法,有上浮swim和下沉sink,另外一般来说A[0]不使用,直接使用A[1]. 堆排序的实现 实现堆排序需要解决两个问题: 1.如何由一个无序序列建成一个堆? 2.如何在输出堆顶元素

优先队列和堆排序

优先队列 堆 1 基于堆的算法 初始化 自底向上堆化 自顶向下堆化 插入删除一项 2 堆排序 优先队列全部代码 1 优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (largest-in,first-out)的行为特征. 优先队列支持两种基本操作:向优先队列中插入一个新的数据项,删除(最大)优先队列中关键字最大的数据项. 优先队列具有很好的灵活性,能支持的操作: -

算法-优先队列与堆排序

我们自己每天使用的电脑能同时运行多个应用程序,没有感觉到卡顿,电脑为每个应用程序的事件分配了一个优先级,移动端的手机也是,通常不管我们是在看电影,发短信只要有电话,电话绝对是优先级最高的.这个时候我们需要一种合理的数据结构删除最大元素和插入元素,我们可以称之为优先队列.实现这种优先队列最合适的数据结构可以通过经典的二叉堆来实现,相对于其他数据结构更高效. 优先队列 开始撸代码之前我们需要明白几个概念: 1.当一棵二叉树的每个节点都大于等于等于它的两个子节点时,它称之为堆有序. 2.二叉堆是一组能

【算法设计-优先队列】优先队列的实现与操作

优先队列是堆排序的一个具体应用. 优先队列分为如下几个操作: 1.INSERT(S,x)把元素x插入到优先队列中. 2.MAXIMUM(S):返回s中具有最大关键字的元素. 3.EXTRACT_MAX(S):去掉S中最大关键字的元素 4.INCREASE_KEY(S,x,k):将元素x的关键字值增加到k,k是不小于x的元素. 优先队列的应用: 1.共享计算机系统的作业调度.最大优先队列要i记录要执行的各个作业以及他们之间的相对优先级.当一个作业完成或者被中断后,调度器调用EXTRACT_MAX从

最大优先队列

最大优先队列 前言 堆排序是一种集插入排序和选择排序的有点于一身的排序算法,但是在后面能学习到更加好的快速排序算法,性能优于堆排序.堆这钟数据结构还有许多其他的用处,例如作为高效的优先队列.优先队列分为最大优先队列和最小优先队列,今天学习了如何用最大堆来实现最大优先队列. 优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字.一个最大优先队列应该支持下面的四种操作: MAXIMUM(S):将集合S中的最大关键字的元素返回. EXTRACT_MAX(

《C算法.第1卷,基础、数据结构、排序和搜索(第三版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <C算法>介绍了当今最重要的算法,共分3卷,<C算法(第1卷):基础.数据结构.排序和摸索>是第1卷.第1卷分4部分.共16章.第一部分"基础知识"(第1-2章)介绍了基本算法分析原理.第二部分"数据结构"(第3-5章)讲解算法分析中必须掌握的数据结构知识.主要包括基本数据结构.抽象数据结构.递归和树.第三部分"排序"(第6-11章)按章节顺序分别讨论了基本排序方法(

【特征匹配】SIFT原理之KD树+BBF算法解析

继上一篇中已经介绍了SIFT原理点击打开链接,最后得到了一系列特征点,每个特征点对应一个128维向量.假如现在有两副图片都已经提取到特征点,现在要做的就是匹配上相似的特征点. 相似性查询有两种基本方式:1.范围查询:即给点查询点和查询阈值,从数据集中找出所有与查询点距离小于阈值的点. 2.K近邻查询:给点查询点及正整数K,从数据集中找到与查询点最近的K个数据,当K=1时,就是最近邻查询. 特征匹配算子可以分为两类:1.穷举法:即将数据集中的点与查询点逐一计算距离,如果图1提取到N1个特征点,图2

数据结构算法[c语言]

共16章,共四部分:基础知识,数据结构,排序和搜索. 所有的实现都是使用C语言缩写.任何语言都有优缺点,选用C语言是因为它使用的广泛. 第一章: 导论 第二章: 算法分析原理 第三章: 基本数据结构 第四章: 抽象数据 第五章: 递归和数 第六章: 基本排序方法 第七章: 快速排序 第八章: 归并和归并排序 第九章: 优先队列和堆排序 第十章: 基数排序 第十一章: 特殊目的的排序方法 第十二章: 符号表和二叉搜索树 第十三章: 平衡树 第十四章: 哈希方法 第十五章: 基数搜索 第十六章: 外

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值