//看了堆排序的代码,理解后自己写的处女-小根堆,堆排序
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;
}