首先简要的介绍一下堆排序。
1.堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,成为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,成为小顶堆。
2.堆排序算法的基本思想:将待排序的序列构成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与对数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。如此反复执行,便能得到一个有序序列了。
好了,下面贴上代码:
#include <iostream>
using namespace std;
#define MAXSIZE 10
typedef struct
{
int r[MAXSIZE+1];
int length;
}Sqlist;
void swap(Sqlist *L, int i, int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
void HeapAdjust(Sqlist *L, int s, int m)
{
int temp, j;
temp = L->r[s];
for (j = 2*s; j <= m; j*=2)
{
if (j < m && L->r[j] < L->r[j+1])
{
j++;
}
if (temp >= L->r[j])
{
break;
}
L->r[s] = L->r[j];
s = j;
}
L->r[s] = temp;
}
void HeapSort(Sqlist* L)
{
int i;
for (int i = L->length / 2; i > 0; i--)
{
HeapAdjust(L, i, L->length);
}
for (i = L->length; i > 1; i--)
{
swap(L, 1, i);
HeapAdjust(L, 1, i-1);
}
}
int main()
{
int a[10] = {9, 7, 1, 2, 3, 4, 5, 8, 6, 0};
Sqlist* L;
L = (Sqlist*)malloc(sizeof(Sqlist));
for (int i = 0; i < 10; i++)
{
L->r[i+1] = a[i];
cout<<a[i]<<" ";
}
cout<<endl;
L->length = MAXSIZE;
L->r[0] = -1;
HeapSort(L);
for (int i = 1; i <= 10; i++)
{
cout<<L->r[i]; }
delete[] L;
}
tips:当时写这个程序时,没有给L动态分配内存,导致对r数组赋值时出现了循环。以后用结构体时,一定不要忘记动态分配。