这个问题好多人使用了最大堆的排序方式,因为我对最大堆不是很了解所以使用了数组。
基本思路是,1:申请一个k大小的辅助数组,然后取数组中的个值赋值给辅助数组,为了方便,取了数组的前k个数字赋给辅助数组。
2:对辅助数组进行排序,从小到达排列。
3:用数组中的数字分别和辅助数组的最大值进行比较,如果小于辅助数组的最大值则,辅助数组中的最大值替换,之后对辅助数组进行排序。下面的过程就是不断的用数组中的值和辅助数组的最大值进行比较。
代码如下:
#define Min_k 6 //要求的数字个数,在这里假设为6
void MaoPao(int *array)//用最简单的冒泡排序对辅助数组进行排序,可以用其他的方法
{
for (int i=0;i<Min_k;i++)
{
for (int j=0;j<Min_k-i;j++)
{
if (array[j]>array[j+1])
{
array[j]=array[j]^array[j+1];
array[j+1]=array[j+1]^array[j];
array[j]=array[j]^array[j+1];
}
}
}
}
void Binsert(int *array) //对辅助的数组进行插入排序
{
int mid,low=0,high=Min_k-2; //最后一个和前(k-1)数字的比较
while (low<=high) //因为是顺序数组,所以直接二分查找,用的时间比较少
{
mid=(low+high)/2;
if (array[Min_k-1]>array[mid])
{
low=mid+1;
}
else
{
high=mid-1;
}
}
int temp=array[Min_k-1];
for (int i=Min_k-2;i>=high+1;i--)
{
array[i+1]=array[i];
}
array[high+1]=temp;
}
void Min_Array(int *array,int n) //k是要求的最小的k个数字,n是数组的大小
{
int assist[Min_k];
for (int i=0;i<Min_k;i++) //取数组的前k个值赋给辅助数组
{
assist[i]=array[i];
}
MaoPao(assist);
for (i=Min_k;i<n;i++)
{
if (array[i]<assist[Min_k-1])
{
assist[Min_k-1]=array[i];//替换掉最大的值
Binsert(assist);
}
}
for (i=0;i<Min_k;i++) //打印出来
{
printf("%d ",assist[i]);
}
}