题目:输入n个整数,输出其中最小的k个。
思路:采用堆排序即可
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
//调整大顶堆
void heapAdjust(int *a, int i, int len)
{
int s;
for (; 2*i+1<len; i=s)
{
s = 2*i+1;
if (s<len-1 && a[s]<a[s+1])
{
s++;
}
if (a[s] > a[i])
{
swap(&a[s], &a[i]);
}
else
{
break;
}
}
}
//建立大顶堆
void buildHeap(int *a, int n)
{
int i;
for (i=n/2-1; i>=0; i--)
{
heapAdjust(a, i, n);
}
}
int main()
{
int a[] = {10, 60, 50, 10, 30, 70, 90};
int i;
int b[] = {1, 2, 6, 4, 5, 2};
buildHeap(a, 7);
for (i=0; i<6; i++)
{
if (b[i] < a[0])
{
a[0] = b[i];
heapAdjust(a, 0, 7);
}
}
for (i=0; i<7; i++)
{
printf("%d\t", a[i]);
}
printf("\n");
}