1. 程式人生 > 其它 >堆排序 大根堆

堆排序 大根堆

技術標籤:排序演算法演算法資料結構heap

#include <iostream>
#include <algorithm>
using namespace std; 
#define MAX 100010

int Heap[MAX];
//Heap[i]的孩子是 2*i+1 2*i+2 父親是(i-1)/2 
int HeapSize = 0;//初始化堆的大小 
void HeapInsert(int Index);//對Index位置上的數進行插入
void Heapify(int Index); 

int main(int argc, char** argv) 
{
	int
n; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d", &Heap[i]); } //對0 - n-1的數 進行堆插入操作 for(int i = 0; i < n; i++) { HeapInsert(HeapSize); HeapSize++; } for(int i = 0; i < n; i++) { Heapify(HeapSize); } return 0; } void HeapInsert(
int Index) { int Father = (Index-1)/2; //當這個節點 比 他的父親節點 大的時候 while(Heap[Index] > Heap[Father] ) { swap(Heap[Index], Heap[Father]); Index = Father; Father = (Father-1)/2; } } void Heapify(int Index) { printf("%d ",Heap[0]); swap(Heap[0],Heap[Index]); HeapSize--; Index = 0; while
(Index <= HeapSize) { int Left = Index*2+1; int Right = Index*2+2; //沒有孩子 不用交換 if(Left > HeapSize) { break; } //選出左右孩子的最大位置 注意 左右孩子沒有的情況 int MaxPos = (Right <= HeapSize)&&(Heap[Right]>Heap[Left]) ? Right : Left; MaxPos = Heap[Index] > Heap[MaxPos] ? Index : MaxPos; if(MaxPos == Index) { break; } swap(Heap[Index],Heap[MaxPos]); Index = MaxPos; } }