zoukankan      html  css  js  c++  java
  • 利用优先队列实现堆排序(自顶向下自底向上堆化全然二叉树的运用)

    源码例如以下:


    #include <stdio.h>
    #include <stdlib.h>
    typedef struct Item *node;
    struct Item{
    	int data;
    	char c;
    };
    static Item *pq;
    static int N ;
    void swap(Item &a,Item &b){struct Item t = a;a = b;b = t;}
    
    void PQinit(int maxN){
    	pq = (node)malloc(maxN*sizeof(node));
    	N = 0;
    }
    
    int PQempty(){
    	return N==0;
    }
    void PQinsert(Item v){
    	pq[N++] = v;
    }
    Item PQdelmax(){
    	int j , max = 0;
    	for(j=1;j<N;j++)
    		if(pq[max].data<pq[j].data) max = j;
    	swap(pq[max],pq[N-1]);
    	return pq[--N];
    }
    
    //自底向上堆化 全然二叉树 父节点的关键值大于等于子节点关键值 
    void fixUp(Item a[],int k){  //k表示破坏堆规则的位置 
    	while(k>1 && a[k/2].data < a[k].data){
    		swap(a[k],a[k/2]);
    		k = k/2;
    	}
    } 
    //自顶向下堆化 
    void fixDown(Item a[],int k,int n){  //k表示破坏堆规则keyword的位置 ,n为堆的大小
    	int j; 
    	while(2*k<=n ){
    		j = 2*k;
    		if(j<n && a[j].data<a[j+1].data)j++; //处理好啦K处节点仅仅有一个子节点的情况 
    		if(a[k].data>=a[j].data)break;
    		swap(a[k],a[j]);
    		k = j;
    	}
    } 
    
    void headSort(Item a[],int l,int r){
    	int k , num = r-l+1;
    	Item *b = a+l-1;
    	for(k = num/2;k>=1;k--)
    		fixDown(b,k,num);//初始化堆结构 
    	while(num>1){
    		swap(b[1],b[num]);
    		fixDown(b,1,--num); //每删除一个最大值keyword。修正堆结构 
    	}
    }
    
    
    main(){
    	PQinit(40);
    	struct Item a[8] = {{0,'0'},{7,'c'},{95,'c'},{12,'c'},{96,'c'},{76,'c'},{36,'c'},{46,'c'}};
    	int j,k ;
    	for(j=1;j<=7;j++)
    		printf("%d ",a[j].data);
    	printf("
    
    排序后
    
    ");
    	headSort(a,1,8);
    	for(k=1;k<=7;k++)
    		printf("%d ",a[k].data);
    }
    



    程序执行结果


  • 相关阅读:
    BZOJ 1707 [Usaco2007 Nov]tanning分配防晒霜
    BZOJ2697:特技飞行
    Bridging signals(NlogN最长上升子序列)
    HDU 4291 A Short problem(矩阵+循环节)
    计蒜之道 初赛第一场B 阿里天池的新任务(简单)
    1008: [HNOI2008]越狱
    1022: [SHOI2008]小约翰的游戏John
    1192: [HNOI2006]鬼谷子的钱袋
    2456: mode
    BZOJ-1968
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7141301.html
Copyright © 2011-2022 走看看