• 堆排序


    堆排序:

    1.建大堆;

    2.堆顶元素和堆最后一个元素交换;

    3.继续建大堆(从上往下调整);

    4.再取堆顶元素与堆尾倒数第二个元素交换;

    5.升序输出

    代码:

    #pragma once
    
    #include<iostream>
    #include<vector>
    //using namespace std;  //尽量不要让 using出现在头文件中 
    
    
    template<class T>
    class Heap
    {
    public:
    	//构造
    	Heap();
    
    	//建大堆
    	Heap(const T* a,size_t size);
    
    	//堆排序
    	void HeapSort();
    	
    	//建堆副
    	void _Heap(const T* a,size_t size);
    
    	//虚向下调整 实向上走
    	void AdjustDown(int index,int num);
    
    	void AdjustUp(int index);
    
    	//打印
    	void Print();
    
    private:
    	vector<T> MinHeap;
    };
    
    template<class T>
    Heap<T>::Heap()
    	{}
    
    template<class T>
    Heap<T>::Heap(const T* a,size_t size)
    {
    	_Heap(a,size);
    }
    
    template<class T>
    void Heap<T>::_Heap(const T *a, size_t size)
    {
    	for(int i = 0; i < size; i++)
    	{
    		MinHeap.push_back(a[i]);
    	}
    	
    	//第一个非叶子结点开始
    	for(int i = (MinHeap.size()-2)/2; i >= 0; i--)
    	{
    		AdjustUp(i);
    	}
    }
    
    template<class T>
    void Heap<T>::AdjustDown(int index,int num)
    {
    	int child = 2*index+1;
    	int cout = num+1;
    	while(child < MinHeap.size()-cout)
    	{
    		if(child+1 <MinHeap.size()-cout && MinHeap[child] < MinHeap[child+1])
    		{
    			child++;
    		}
    
    		if(MinHeap[child] > MinHeap[(child-1)/2])
    		{
    			swap(MinHeap[child],MinHeap[(child-1)/2]);
    			index = child; //交换后的是不是打乱了顺序  继续
    			child = 2*index+1;//等效循环外的第一个条件
    		}
    		else
    		{
    			break;	
    		}
    	}
    }
    
    template<class T>
    void Heap<T>::AdjustUp(int index)
    {
    	int child = index*2 + 1;
    	while(child < MinHeap.size())
    	{
    		if((child+1)< MinHeap.size() && MinHeap[child+1] > MinHeap[child])
    		{
    			child++;
    		}
    
    		if(MinHeap[child] > MinHeap[(child-1)/2])
    		{
    			swap(MinHeap[child],MinHeap[(child-1)/2]);
    			index = child;
    			child = 2*index+1;
    		}
    		else
    		{
    			break;
    		}
    	}
    }
    
    template<class T>
    void Heap<T>::HeapSort()
    {
    	for(int i = 0; i < MinHeap.size(); i++)
    	{
    		int num = MinHeap.size()-i-1;
    		swap(MinHeap[0],MinHeap[num]);
    		AdjustDown(0,i);
    	}
    }
    
    template<class T>
    void Heap<T>::Print()
    {
    	for(int i = 0; i < MinHeap.size();i++)
    	{
    		cout<<MinHeap[i]<<" ";
    	}
    	cout<<endl;
    }


  • 相关阅读:
    centos8重置root密码
    Mysql查询某列最长字符串记录
    ssm连接mysql出现Connections could not be acquired from the underlying database 问题
    spring-基于xml配置Bean
    WinForm控件命名缩写
    SQL Server 将一张表的某个字段更新到另一张表中
    SQL Server 取出指定字符后字符串(用于分割)
    小白学CMD下运行MySQL
    Bootstrap3.0和bootstrap2.x的区别
    有关js弹出提示框几种方法
  • 原文地址:https://www.cnblogs.com/melons/p/5791880.html
Copyright © 2020-2023  润新知