这里写自定义目录标题
软考系列-2022下半年试题四-C程序算法
说明
排序是将一组无序的数据元素调整为非递减顺序的数据序列的过程,堆排序是一种常用的排序算法。用顺序存储结构存储堆中元素。非递减堆排序的步骤是:
(1)将含n个元素的待排序数列构造成一个初始大顶堆,存储在数组R(R[1],R[2],…,R[n])中。此时堆的规模为n,堆顶元素R[1]就是序列中最大的元素,R[n]是堆中最后一个元素。
(2)将堆顶元素和堆中最后一个元素交换,最后一个元素脱离堆结构,堆的规模减1,将堆中剩余的元素调整成大顶堆;
(3)重复步骤(2),直到只剩下最后一个元素在堆结构中,此时数组R是一个非递减的数据序列。
代码
#include <stdio.h>
//https://c.runoob.com/compile/11/
void Heapify(int R[], int v, int n) {
int i, j;
i = v;
j = 2 * i;
R[0] = R[i];
while (j <= n) {
if (j < n && R[j] < R[j + 1]) {
j++ ;
}
if (R[0]<R[j]) {
R[i] = R[j];
i = j;
j = 2 * i;
} else {
j = n + 1;
}
}
R[i] = R[0];
}
void HeapSort(int R[], int n) {
int i;
for (i = n / 2; i >= 1; i -- ) {
Heapify(R,i,n);
}
printf("=======");
int k;
for (k = 1; k <= n; k ++) {
printf("%d ",R[k]);
}
for (i = n; i > 1 ; i -- ) {
R[0] = R[i];
R[i] = R[1];
R[1] = R[0];
Heapify(R, 1, i - 1);
}
printf("=======");
int l;
for (l = 1; l <= n; l ++) {
printf("%d ",R[l]);
}
}
int main() {
int R[9] = {0,7,10,13,15,4,20,19,8};
int n = 8;
HeapSort(R,n);
int R2[9] = {0,8,15,19,10,4,13,7,20};
int n2 = 7;
HeapSort(R2,n2);
return 0;
}