输入n个整数,寻找其中最小的k个数。
思想1:对n个整数进行堆排序,选择其中最小的k个。
思想2:维护k个元素的最大堆。
#include<stdio.h>
#include<stdlib.h>
#define size 10
/*思想1*/
/*以第i个元素为父结点,调整堆*/
void HeapAdjust(int *a, int i, int len) {
int lchild = 2 * i + 1;
int rchild = 2 * i + 2;
int max = i;
if (lchild <= len - 1 && a[lchild] < a[max])
max = lchild;
if (rchild <= len - 1 && a[rchild] < a[max])
max = rchild;
if (max != i) {
/*swap(a[max], a[i]);*/
int t = a[max];
a[max] = a[i];
a[i] = t;
HeapAdjust(a, max, len);
}
}
/*建立堆*/
void BuildHeap(int *a, int len) {
int i;
for (i = len / 2 - 1; i >= 0; i--) {
HeapAdjust(a, i, len);
}
}
/*堆排序*/
void HeapSort(int *a, int len) {
int i;
BuildHeap(a, len);
for (i = len-1; i > 0; i--) {
//swap(a[i], a[0]);
int t = a[i];
a[i] = a[0];
a[0] = t;
HeapAdjust(a, 0, i);
}
}
int main() {
int A[size] = { 9,12,17,30,50,20,60,65,4,19 };
HeapSort(A, size);
for (int i = size-1; i >= 0; i--) {
printf("%d ", A[i]);
}
return 0;
}