//看了堆排序的代码,理解后自己写的处女-小根堆,堆排序
void swap(int*a,int*b){ //交换函数,参数是地址
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void lowdui(int *arr,int k,int n){ //执行一次父节点k,和双子的比较,本题选的小根堆,值小的放到父结点上
int x=2*k;
if(x+1>=n){
return;
}
if((x+1)<n&&arr[x+1]<arr[k]){ //左边比较,父节点值大,就交换
swap(&arr[x+1],&arr[k]);
}
x++; //右孩子
if((x+1)<n&&arr[x+1]<arr[k]){ //右边比较,父节点大的就交换
swap(&arr[x+1],&arr[k]);
}
}
void lowsort(int*arr,int n){ //全部检查,不符合交换,lowsort 一次就是找出了最小值放在arr[0]处
for(int i=n/2-1;i>=0;i--){ //从最后一个父节点开始,往前
lowdui(arr,i,n);
}
}
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize ) {
// write code here
int* returnarr=(int*)malloc(sizeof(int)*k); //申请数组,存放返回数组
int n=inputLen;
int j=0;
for(int i=n-1;i>n-k-1;i--){ //只需要k个,就n-k-1,i是最后一个数下标
lowsort(input,i+1); //注意参数,i+1长度的调整一次,最小的放在了input[0]处
swap(&input[0],&input[i]); //最小值交换一下,随后长度减一
returnarr[j++]=input[i]; //这里直接把最小的那个放进返回数组
}
*returnSize=k;//这个是数组长度,题干给的注释是数组行数,真服了(就按数组长度)。就自己运行几次就知道这个是啥了
return returnarr;
}