堆排序

来源:互联网 发布:吸入麻醉药mac值表 编辑:程序博客网 时间:2024/06/05 13:33

定义:堆:堆数据结构是一种数组现象,可以视为一个完全二叉树,树中的每个节点与数组中存放该节点值的那个元素对应;

性质: a[parent[i]] >= A[i];(大顶堆) a[parent[i]] <=A[i](小顶堆)

堆的应用:优先级队列;

三个常用的操作说明:

HeapAdjust:一个已经有序的堆顶点插入一个节点的调整过程;

BuildHeap:一个无序数组调整成一个堆;(向上排序)

HeapSort:对一个有序堆按序输出的过程;


#include "stdafx.h"#include <iostream>using namespace std;int MAX = 100;typedef struct {int heapsize;int array[100];}heap;void HeapAdjust(int *a,int i,int heapsize)//调整过程{int lchild = 2*i;int rchild = 2*i+1;int max = i;if(lchild <= heapsize&&a[i] < a[lchild])max = lchild;if(rchild <= heapsize && a[max] < a[rchild])max = rchild;if(max != i){int temp = a[i];a[i] = a[max];a[max] = temp;HeapAdjust(a,max,heapsize);}}void BuildHeap(int *a,int size)//建堆过程{int i;for(i = size/2;i > 0;i--)//最大的非叶节点为size/2{HeapAdjust(a,i,size);}}void HeapSort(int *a,int size)//堆排序过程{int i = size;int k;BuildHeap(a,size);for(i = size;i >1;i--){k = a[1];a[1] = a[i];a[i] = k;HeapAdjust(a,1,i-1);}}int _tmain(int argc, _TCHAR* argv[]){//Merge_sort(a,0,9);int size;heap h1;while(scanf("%d",&size) ==1 &&size > 0){int i;h1.heapsize = size;for(i = 1;i <= size;i++)cin >> h1.array[i];HeapSort(h1.array,h1.heapsize);for(i = 1;i <= size;i++)printf("%d",h1.array[i]);}return 0;}


原创粉丝点击