打算写点东西了,算法导论学习笔记
思想改变世界,技术连接你我。果果,今天过得好吗? —–Joly Zhang |
---|
第六章 堆排序
6.1堆
6.2保持对的性质
6.3建堆
6.4堆排序算法
/**
Introduce to Algorithm 6
--Joly·Zhang
**/
#include<stdio.h>
#include<stdlib.h>
#define LEFT(i) (i<<1)
#define RIGHT(i) ((i<<1)+1)
#define PARENT(i) (i>>1)
#define MAX_SIZE 30
//功能:对节点i进行调整,使成为大根对
//前提条件:i的子树为大根堆
void max_heapify(int A[], int heap_size, int i)
{
int l = LEFT(i);
int r = RIGHT(i);
int largest = i;
if (l <= heap_size && A[i] < A[l])
{
largest = l;
}
if (r <= heap_size && A[r] > A[largest])
{
largest = r;
}
if (largest != i)
{
int temp = A[largest];
A[largest] = A[i];
A[i] = temp;
max_heapify(A, heap_size, largest);
}
}
//功能:将数组A调整为大根堆
void build_max_heap(int A[], int heap_size)
{
for (int k = heap_size / 2; k >= 1; --k)
{
max_heapify(A, heap_size, k);
}
}
/*
功能:堆排序,使数组A降序排列
原理:
step1:建立大根堆。
step2: 将最大值(根节点的键)与最后一个值交换。
step3: 调整规模为heap_size-1的大根堆。
重复步骤2-3,至排序完成。
*/
void heap_sort(int A[],int heap_size)
{
build_max_heap(A, heap_size);
for (int k = heap_size; k >= 2; --k)
{
int max = A[1];
A[1] = A[k];
A[k] = max;
--heap_size;
max_heapify(A, heap_size, 1);
}
}
int main()
{
int data[MAX_SIZE + 1];
int n;
scanf_s("%d", &n);
for (int k = 1; k <= n; k++)
{
scanf_s("%d", &data[k]);
}
heap_sort(data, n);
for (int k = 1; k <= n; ++k)
{
printf("%d ", data[k]);
}
printf("\n");
system("pause");
return 0;
}