• 堆排序


    堆排序:

    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;
    }


  • 相关阅读:
    centos7/RHEL7安装LibreOffice
    CentOS7开机启动管理systemd简介及使用
    Vim使用技巧
    16_用LVM扩展xfs文件系统(当分区空间不够时)
    15_RHEL7挂载NTFS分区
    14_RHEL7安装mplayer
    polyfill-eventsource added missing EventSource to window ie浏览器 解决方案
    关于vue,webpack 中 “exports is not defined”报错
    2018 vue前端面试题
    Error: No PostCSS Config found in... 报错 踩坑记
  • 原文地址:https://www.cnblogs.com/melons/p/5791880.html
Copyright © 2020-2023  润新知