zoukankan      html  css  js  c++  java
  • 排序-堆排序

    堆排序

    最大堆调整:将堆的末端子节点作调整,使得子节点永远小于父节点
    创建最大堆:将堆中的所有数据重新排序
    堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算

    //算法8.9 堆排序
    #include <iostream>
    using namespace std;
    #define  MAXSIZE  20          						//顺序表的最大长度
    typedef struct
    {
    	int key;
    	char *otherinfo;
    }ElemType;
    //顺序表的存储结构                         
    typedef struct
    {
        ElemType *r;	         						//存储空间的基地址
        int  length;            						//顺序表长度
    }SqList;											//顺序表类型
    
    //用算法8.7 筛选法调整堆
    void HeapAdjust(SqList &L,int s,int m)
    { 
       //假设r[s+1..m]已经是堆,将r[s..m]调整为以r[s]为根的大根堆
    	ElemType rc;
    	int j;
    	rc=L.r[s];
        for(j=2*s;j<=m;j*=2)
    	{												//沿key较大的孩子结点向下筛选
    		if(j<m&&L.r[j].key<L.r[j+1].key) ++j;		//j为key较大的记录的下标
            if(rc.key>=L.r[j].key) break;      			//rc应插入在位置s上
    		L.r[s]=L.r[j]; s=j; 
        }
    	L.r[s]=rc;                          			//插入
    }
    													//HeapAdjust								
    void Create_Sq(SqList &L)
    {
    	int i,n;
    	cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
    	cin>>n;											//输入个数
    	cout<<"请输入待排序的数据:
    ";
    	while(n>MAXSIZE)
    	{
    		cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
    		cin>>n;
    	}
    	for(i=1;i<=n;i++)
    	{
    		cin>>L.r[i].key;
    		L.length++;
    	}
    }
    
    //用算法8.8 建初堆
    void CreatHeap(SqList &L)
    {
    	//把无序序列L.r[1..n]建成大根堆
    	int i,n;
    	n=L.length;
    	for(i=n/2;i>0;--i)       					//反复调用HeapAdjust 
    		HeapAdjust(L,i,n);
    }												//CreatHeap
    
    void HeapSort(SqList &L) 
    { 
    	//对顺序表L进行堆排序 
    	int i;
    	ElemType x;
    	CreatHeap(L);              					//把无序序列L.r[1..L.length]建成大根堆 
    	for(i=L.length;i>1;--i)
    	{ 
    		x=L.r[1];               				//将堆顶记录和当前未经排序子序列L.r[1..i]中最后一个记录互换 
    		L.r[1]=L.r[i];            
    		L.r[i]=x; 
    		HeapAdjust(L,1,i-1);					//将L.r[1..i-1]重新调整为大根堆 
       }//for 
    }//HeapSort
    void show(SqList L)
    {
    	int i;
    	for(i=1;i<=L.length;i++)
    		cout<<L.r[i].key<<endl;
    }
    void main()
    {
    	SqList L;
    	L.r=new ElemType[MAXSIZE+1];
    	L.length=0;
    	Create_Sq(L);
    	HeapSort(L);
    	cout<<"排序后的结果为:"<<endl;
    	show(L);
    }
    
  • 相关阅读:
    男子胃脘胀痛案(知老)
    转 Django中的Form
    转 Alert.log shows No Standby Redo Logfiles Of Size 153600 Blocks Available
    转发 django 初探
    转 Logs are not shipped to the physical standby database
    python 之django (一) Windows环境下Django 1.6.11开发环境搭建(简易版)
    oracle db 产品路线图
    转 python中%s与%d
    转 python 的常用函数replace, split(),enumerate() 函数
    转 [Error]EOL while scanning string literal
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12070551.html
Copyright © 2011-2022 走看看