堆排序

来源:互联网 发布:唐小僧 卓软件 编辑:程序博客网 时间:2024/06/06 03:22

原文出处:http://www.cnblogs.com/mengdd/archive/2012/11/30/2796845.html

#include<iostream>using namespace std;typedef int ElemType;void HeapAdjust(ElemType H[], int start, int end){ElemType temp = H[start];for (int i = 2 * start + 1; i <= end; i *= 2){//因为假设根结点的序号为0而不是1,所以i结点左孩子和右孩子分别为2i+1和2i+2if (i<end && H[i]<H[i + 1])//左右孩子的比较{++i;//i为较大的记录的下标}if (temp > H[i])//左右孩子中获胜者与父亲的比较{break;}//将孩子结点上位,则以孩子结点的位置进行下一轮的筛选H[start] = H[i];start = i;}H[start] = temp; //插入最开始不和谐的元素}void HeapSort(ElemType A[], int n){//先建立大顶堆for (int i = n / 2; i >= 0; --i){HeapAdjust(A, i, n);}//进行排序for (int i = n - 1; i>0; --i){//最后一个元素和第一元素进行交换ElemType temp = A[i];A[i] = A[0];A[0] = temp;//然后将剩下的无序元素继续调整为大顶堆HeapAdjust(A, 0, i - 1);}}int main(){int a[100];for (int i = 0; i < 10; i++)std::cin >> a[i];HeapSort(a, 10);for (int i = 0; i < 10; i++)cout << a[i] << ' ';while (1);}