【算法笔记】堆排序实现代码

//建堆时向下调整,或者删除元素进行向下调整

void downAdjust(int root,int n){//root为当前欲调整的节点下标,n为节点总数 
	int i = root , j = i*2;//i为欲调整的节点,j为i的左节点
	while(j<=n){
		if(j+1<=n&&heap[j+1]>heap[j]) j++;//j = j+1
		if(heap[i]<heap[j]){//当前节点比其子节点小那么进行交换 
			swap(heap[i],heap[j]);
			i = j;
			j = j*2; 
		}
		else break;//否则就表明以root为根的子树是一个堆。 
	} 
}

//向上调整,用于插入元素时使用

void upAdjust(int root){ //root表示当前想要调整的元素下标,也就是堆中最后一个元素。 
	int i = root,j = i/2;//j为i的父节点 
	while(j>=1){
		if(heap[j]<heap[i]){//父节点比子节点小进行调整 
			swap(heap[i],heap[j]);
			i = j;
			j = j/2; 
		} 
		else break;
	} 
}

//删除堆顶元素

void deleteTop(int n){
	heap[1] = heap[n];
	n--;
	downAdjust(1,n);
}

//插入元素

void insert(int key,int n){
	heap[n] = key;n++;
	upAdjust(n);	
}

//建堆

void Creat_Heap(int N){
	for(int i = N/2;i>=1;i--)
		downAdjust(i,N);
}

//堆排序

void heapSort(int n){
	for(int i=n;i>=1;i--){
		swap(heap[i],heap[1]);
		downAdjust(1,i-1);
	}
}

完整代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100;
int heap[maxn];
//建堆时向下调整,或者删除元素进行向下调整 
void downAdjust(int root,int n){//root为当前欲调整的节点下标,n为节点总数 
	int i = root , j = i*2;//i为欲调整的节点,j为i的左节点
	while(j<=n){
		if(j+1<=n&&heap[j+1]>heap[j]) j++;//j = j+1
		if(heap[i]<heap[j]){//当前节点比其子节点小那么进行交换 
			swap(heap[i],heap[j]);
			i = j;
			j = j*2; 
		}
		else break;//否则就表明以root为根的子树是一个堆。 
	} 
}
//向上调整,用于插入元素时使用 
void upAdjust(int root){ //root表示当前想要调整的元素下标,也就是堆中最后一个元素。 
	int i = root,j = i/2;//j为i的父节点 
	while(j>=1){
		if(heap[j]<heap[i]){//父节点比子节点小进行调整 
			swap(heap[i],heap[j]);
			i = j;
			j = j/2; 
		} 
		else break;
	} 
}
//删除堆顶元素 
void deleteTop(int n){
	heap[1] = heap[n];
	n--;
	downAdjust(1,n);
}
//插入元素 
void insert(int key,int n){
	heap[n] = key;n++;
	upAdjust(n);	
}
void Creat_Heap(int N){
	for(int i = N/2;i>=1;i--)
		downAdjust(i,N);
}
void heapSort(int n){
	for(int i=n;i>=1;i--){
		swap(heap[i],heap[1]);
		downAdjust(1,i-1);
	}
}
int main(){
#ifdef ONLINE_JUDGE
#else
	freopen("1.txt","r",stdin);
#endif
	int N;scanf("%d",&N);
	for(int i=1;i<=N;i++){
		scanf("%d",&heap[i]);
	}
	for(int i=1;i<=N;i++) cout<<heap[i]<<" ";
	cout<<endl;
	Creat_Heap(N);
	heapSort(N);
	for(int i=1;i<=N;i++) cout<<heap[i]<<" ";
} 

输出结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39072627/article/details/107435291
今日推荐