堆排序
用数组去表示二叉树的层次建树的结构,就是堆。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
//选择排序包括简单选择排序、堆排序
typedef int ElemType;
typedef struct {
ElemType* elem;//整型指针
int TableLen;//元素个数
}SSTable;
void ST_Init(SSTable& ST, int len)
{
ST.TableLen = len;//实际申请11个元素空间
ST.elem = (ElemType*)malloc(sizeof(ElemType) * ST.TableLen);
int i;
srand(time(NULL));//随机数生成,每一次执行代码就会得到随机的10个元素
for (i = 0; i < ST.TableLen; i++)
ST.elem[i] = rand() % 100;//随机了11个数,但是第一个元素是没有用到的
}
void ST_print(SSTable ST)
{
for (int i = 0; i < ST.TableLen; i++)
printf("%3d", ST.elem[i]);
printf("\n");
}
void swap(ElemType& a, ElemType& b)
{
ElemType temp;
temp = a;
a = b;
b = temp;
}
void SelectSort(ElemType A[], int n)
{
int i, j, min;//min记录最小的元素的下标
for (i = 0; i < n - 1; i++)//i最多可以为8
{
min = i;
for (j = i + 1; j < n; j++)//j最多可以为9
{
if (A[j] < A[min])
min = j;
}
if (min != j)
swap(A[i], A[min]);
}
}
//调整子树
void AdjustDown(ElemType A[], int k, int len)
{
int dad = k;
int son = 2 * dad + 1; //左孩子下标
while (son <= len)
{
if (son + 1 <= len && A[son] < A[son + 1])//看下有没有右孩子,比较左右孩子选大的
{
son++;
}
if (A[son] > A[dad])//比较孩子和父亲
{
swap(A[son], A[dad]);
dad = son;
son = 2 * dad + 1;
}
else {
break;
}
}
}
//用数组去表示树 层次建树
void BuildMaxHeap(ElemType A[], int len)
{
for (int i = len / 2; i >= 0; i--)
AdjustDown(A, i, len);
}
void HeapSort(ElemType A[], int len)
{
int i;
BuildMaxHeap(A, len);//建立大顶堆
swap(A[0], A[len]);//交换顶部和数组最后一个元素
for (i = len - 1; i > 0; i--)
{
AdjustDown(A, 0, i);//剩下元素调整为大根堆
swap(A[0], A[i]);
}
}
int main()
{
SSTable ST;
ElemType A[10] = { 64,94,95,79,69,84,18,22,12,78 };
ST_Init(ST, 10);//初始化
memcpy(ST.elem, A, sizeof(A));//内存copy接口,当你copy整型数组,或者浮点型时,要用memcpy
ST_print(ST);
HeapSort(ST.elem, 9);//所有元素参与排序
ST_print(ST);
}
运行截图如下: