mirror of
				http://172.16.0.230/r/SIF/TowerOptoSifAndSpectral.git
				synced 2025-10-25 13:59:44 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| namespace ZZ_MATH
 | |
| {
 | |
| 
 | |
| 	template<typename T>
 | |
| 	void MinHeapify(T*arry, int size, int element)
 | |
| 	{
 | |
| 		int lchild = element * 2 + 1, rchild = lchild + 1;
 | |
| 		while (rchild < size)
 | |
| 		{
 | |
| 			if (arry[element] <= arry[lchild] && arry[element] <= arry[rchild])
 | |
| 			{
 | |
| 				return;
 | |
| 			}
 | |
| 			if (arry[lchild] <= arry[rchild])
 | |
| 			{
 | |
| 				std::swap(arry[element], arry[lchild]);
 | |
| 				element = lchild;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				std::swap(arry[element], arry[rchild]);
 | |
| 				element = rchild;
 | |
| 			}
 | |
| 			lchild = element * 2 + 1;
 | |
| 			rchild = lchild + 1;
 | |
| 		}
 | |
| 		if (lchild < size&&arry[lchild] < arry[element])
 | |
| 		{
 | |
| 			std::swap(arry[lchild], arry[element]);
 | |
| 		}
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	template<typename T>
 | |
| 	void MaxHeapify(T*arry, int size, int element)
 | |
| 	{
 | |
| 		int lchild = element * 2 + 1, rchild = lchild + 1;
 | |
| 		while (rchild < size)
 | |
| 		{
 | |
| 			if (arry[element] >= arry[lchild] && arry[element] >= arry[rchild])
 | |
| 			{
 | |
| 				return;
 | |
| 			}
 | |
| 			if (arry[lchild] >= arry[rchild])
 | |
| 			{
 | |
| 				std::swap(arry[element], arry[lchild]);
 | |
| 				element = lchild;
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				std::swap(arry[element], arry[rchild]);
 | |
| 				element = rchild;
 | |
| 			}
 | |
| 			lchild = element * 2 + 1;
 | |
| 			rchild = lchild + 1;
 | |
| 		}
 | |
| 		if (lchild<size&&arry[lchild]>arry[element])
 | |
| 		{
 | |
| 			std::swap(arry[lchild], arry[element]);
 | |
| 		}
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	template<typename T>
 | |
| 	void HeapSort(T*arry, int size)
 | |
| 	{
 | |
| 		int i;
 | |
| 		for (i = size - 1; i >= 0; i--)
 | |
| 		{
 | |
| 			MinHeapify(arry, size, i);
 | |
| 		}
 | |
| 		while (size > 0)
 | |
| 		{
 | |
| 			std::swap(arry[size - 1], arry[0]);
 | |
| 
 | |
| 			size--;
 | |
| 			MinHeapify(arry, size, 0);
 | |
| 		}
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| }
 |