堆排序实现
发布时间:2020-12-15 06:21:05 所属栏目:百科 来源:网络整理
导读:// 算法.cpp : 定义控制台应用程序的入口点。//对于堆排序来说,逻辑上是树的形式,实际存储的形式还是数组。只是对下标进行一定的计算获得逻辑上树的形式。//此堆的结构为0号位为根结点,没有左子树,右边接着以1号位置为根结点的子树。#include "stdafx.h"
// 算法.cpp : 定义控制台应用程序的入口点。 //对于堆排序来说,逻辑上是树的形式,实际存储的形式还是数组。只是对下标进行一定的计算获得逻辑上树的形式。 //此堆的结构为0号位为根结点,没有左子树,右边接着以1号位置为根结点的子树。 #include "stdafx.h" #include <iostream> using namespace std; const int HEAP_SIZE = 13; //堆大小 int parent(int); int left(int); int right(int); void Max_Heapify(int [],int,int); void Build_Max_Heap(int []); void print(int []); void HeapSort(int [],int); int _tmain(int argc,_TCHAR* argv[]) { int A[HEAP_SIZE] = {19,1,10,14,16,4,7,9,3,2,8,5,11}; HeapSort(A,HEAP_SIZE); system("pause"); return 0; } //获得左子结点 int left(int i) { return 2 * i; } //获得右子结点 int right(int i) { return (2 * i + 1); } //最大根结点调整 void Max_Heapify(int A[],int i,int heap_size) { int l = left(i); int r = right(i); int largest; int temp; //找出三个结点中最大的一个 if(l < heap_size && A[l] > A[i]) { largest = l; } else { largest = i; } if(r < heap_size && A[r] > A[largest]) { largest = r; } //将最大的结点设置为根结点 if(largest != i) { temp = A[i]; A[i] = A[largest]; A[largest] = temp; //递归实现子树最大根结点 Max_Heapify(A,largest,heap_size); } } //建立最大堆 void Build_Max_Heap(int A[]) { for(int i = (HEAP_SIZE-1)/2; i >= 0; i--) { //子树最大堆调整 Max_Heapify(A,i,HEAP_SIZE); } } //打印树 void print(int A[]) { for(int i = 0; i < HEAP_SIZE;i++) { printf("%d ",A[i]); } printf("n"); } //堆排序 void HeapSort(int A[],int heap_size) { Build_Max_Heap(A); int temp; for(int i = heap_size - 1; i > 0; i--) { //将最大的放在堆尾 temp = A[0]; A[0] = A[i]; A[i] = temp; //最大根结点调整 Max_Heapify(A,i); } print(A); } ? Flash http://ds.fzu.edu.cn/fine/resources/FlashContent.asp?id=88 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |