首先建立最大堆,然后让当前最后一个元素替换第一个元素,此时可能破环最大堆的结构,并进行堆的不断调整过程。堆排序的时间复杂度为:O(nlogn)。
#include "stdafx.h"
#include <iostream>
#include<algorithm>
using namespace std;
void heapAdjust(int a[], int i, int len) {
int lchild = 2 * i;
int rchild = 2 * i + 1;
int max = i;
if (i<=len/2)
{
if (lchild + 1 <= len&&a[lchild] > a[max]) {
max = lchild;
}
if (rchild+1<=len&&a[rchild]>a[max])
{
max = rchild;
}
if (max!=i)
{
swap(a[i],a[max]);
heapAdjust(a,max,len);
}
}
}
void heapBuild(int a[], int len) {
for (int i = len/2; i >=0; i--)
{
heapAdjust(a,i,len);
}
}
void heapSort(int a[], int len) {
heapBuild(a,len); //建立大顶堆
for (int i = len-1; i >=0; i--)
{
swap(a[0],a[i]); //将第一个值与最后一个值交换,将最大值移动到当前最末尾
heapAdjust(a,0,i-1); //调整堆结构
}
}
void output(int a[], int len) {
for (int i = 0; i < len; i++) {
cout << a[i] << " ";
}
cout << endl;
}
int main()
{
int a[6] = {96,83,27,38,11,9};
int len = sizeof(a)/sizeof(a[0]);
heapSort(a,len);
output(a, len);
return 0;
}