【题目】
从键盘读入大小无序的20000个整数并建立顺序表,请用时间复杂度最低的算法从中挑选除最大的20个整数并打印。
【代码】
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 21 //可根据题目修改MAX的值
typedef int elemtype;
typedef struct {
elemtype data[MAX];
}SqList;
void initSqList(SqList* List) {
int i;
for (i = 1; i < MAX; i++) { //从1开始
List->data[i] = rand() % 100 + 1; //1~100,可修改
}
}
//将元素key为根的子树进行调整
void HeadAdjust(SqList* L, int key, int len) {
int i;
L->data[0] = L->data[key]; //暂存子树的根节点
for (i = 2 * key; i <= len; i *= 2) { //沿着较大的结点往下筛选
if (i < len && L->data[i] < L->data[i + 1]) //比较左右孩子的大小
i++;
if (L->data[0] >= L->data[i]) //满足大根堆,跳出for循环
break;
else { //不满足,交换位置,继续往下调整
L->data[key] = L->data[i];
key = i;
}
}
L->data[key] = L->data[0];
}
void BuildMAXHeap(SqList* L, int len) {
int i;
for (i = len / 2; i > 0; i--) { //从中间位置开始排序
HeadAdjust(L, i, len); //调整
}
}
void HeapSort(SqList* L, int len) {
int i,temp;
BuildMAXHeap(L, len); //初始建堆
for (i = len; i > 1; i--) { //由于我们从1开始,所以到1结束
temp = L->data[1];
L->data[1] = L->data[i];
L->data[i] = temp;
HeadAdjust(L, 1, i - 1);
}
}
int main() {
SqList* L = (SqList*)malloc(sizeof(SqList));
initSqList(L);
for (int i = 1; i < MAX; i++){
printf("%4d", L->data[i]);
}
printf("\n");
HeapSort(L, MAX);
for (int i = MAX; i>1; i--) { //从大到小输出
printf("%4d", L->data[i]);
}
return 1;
}