import java.util.*;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
//         冒泡排序
//         int[] arr = bubbleSort(input,k);
//         插入排序
//         int[] arr = insertSort(input,k);
//         希尔排序
//         int[] arr = shellSort(input,k);
//         归并排序
//         int[] arr = mergeSort(input,k);
//         快速排序
        int[] arr = quickSort(input,k);
//         计数排序
//         int[] arr = countSort(input,k);
//         基数排序---有0不行
//         int[] arr = radixSort(input,k);
        return arrToList(arr);
    }
//     冒泡排序
    public int[] bubbleSort(int[] arr,int k){
        if(arr.length<k)return new int[1];
        if(arr.length==k)return arr;
        for(int i=0;i<arr.length;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j])swap(arr,i,j);
            }
        }
        return cutArray(arr,k);
    }
    
//     插入排序
    public int[] insertSort(int[] arr,int k){
        if(arr.length<k)return null;
        if(arr.length==k)return arr;
        for(int i =1;i<arr.length;i++){
            for(int j = i;j>0;j--){
                if(arr[j]<arr[j-1])swap(arr,j,j-1);
            }
        }
        return cutArray(arr,k);
    }
    
//     希尔排序
    public int[] shellSort(int[] arr,int k){
        if(arr.length<k)return null;
        if(arr.length==k)return arr;
//         设置间隔
        int gap=1;
        while(gap<arr.length/3){
            gap = gap*3+1;
        }
        
        while(gap>0){
            for(int i=gap;i<arr.length;i++){
                for(int j=i;j-gap>=0;j=j-gap){
                    if(arr[j]<arr[j-gap])swap(arr,j,j-gap);
                }
            }
            //缩短间隔
            gap=(gap-1)/3;
        }
        
        return cutArray(arr,k);
    }

//     归并排序
    public int[] mergeSort(int[] arr,int k){
        if(arr.length<k)return null;
        if(arr.length==k)return arr;
        mergesort(arr,0,arr.length-1);
        return cutArray(arr,k);
    }
    
    public int[] mergesort(int[] arr,int left,int right){
        if(left>=right)return arr;
        int mid = left+(right-left)/2;
        mergesort(arr,left,mid);
        mergesort(arr,mid+1,right);
        merge(arr,left,mid+1,right);
        return arr;
    }
    public void merge(int[] arr,int leftPr,int rightPr,int end){
        int i=leftPr,j=rightPr,k=0;
        int[] temp = new int[end-leftPr+1];
        while(i<=rightPr-1 && j<=end){
            if(arr[i]<=arr[j]){
                temp[k++] = arr[i++];
            }else{
                temp[k++] = arr[j++];
            }   
        }
//         剩余数组接龙
        while(i<rightPr)temp[k++] = arr[i++];
        while(j<=end)temp[k++] = arr[j++];
        
//         还原
        for(int m=0;m<temp.length;m++){
            arr[leftPr+m]=temp[m];
        }
    }
    
//     快速排序
    public int[] quickSort(int[] arr,int k){
        if(arr.length<k)return null;
        if(arr.length==k)return arr;
        quicksort(arr,0,arr.length-1);
        return cutArray(arr,k);
    }
    public void quicksort(int[] arr,int left,int right){
        if(left>=right)return;
        int pirot = arr[left];
        int i=left,j=right;
        while(i<j){
            while(arr[j]>=pirot && i<j)j--;
            while(arr[i]<=pirot && i<j)i++;
            if(i<j)swap(arr,i,j);
        }
        swap(arr,i,left);
        quicksort(arr,left,j-1);
        quicksort(arr,j+1,right);
    }
    
//     计数排序
    public int[] countSort(int[] arr,int k){
        if(arr.length<k)return null;
        if(arr.length==k)return arr;
//         计数数组
        int[] count = new int[1000];
        int[] newArr = new int[arr.length];
        for(int i:arr){
            count[i]++;
        }
        int m = 0;
        for(int i=0;i<count.length;i++){
            while(count[i]--!=0)newArr[m++]=i;
        }
        return cutArray(newArr,k);
    }
    
//     基数排序
    public int[] radixSort(int[] arr,int k){
        if(arr.length<k)return null;
        if(arr.length==k)return arr;
//         获取最大位数
        int max = 1;
        for(int i=0;i<arr.length;i++){
            int count = 1,temp = arr[i];
            while(temp/10>0){
                temp=temp/10;
                count++;
            }
            if(count>max)max=count;
        }
        
        
        for(int i=0;i<max;i++){
//         定义二维数组
            int[][] radix = new int[10][arr.length];
            for(int j=0;j<arr.length;j++){
                int temp = arr[j];
                int n = i;
                while(n-->0){
                    temp=temp/10;
                }
                int result = temp%10;
                for(int m=0;m<radix[result].length;m++){
                    if(radix[result][m]==0){
                        radix[result][m]=arr[j];
                        break;
                    }
                }
            }
            arr = reGroup(radix,arr.length);
        }
        return cutArray(arr,k);
    }
    
//     重排二维数组
    public int[] reGroup(int[][] count,int length){
        int[] arr = new int[length];
        int k = 0;
        for(int i=0;i<count.length;i++){
            for(int j=0;j<count[i].length;j++){
                if(count[i][j]!=0)arr[k++] = count[i][j];
            }
        }
        return arr;
    }
    
//     截取数组
    public int[] cutArray(int[] arr,int k){
        int[] newArr = new int[k];
        int m=0;
        for(int i=0;i<k;i++)newArr[m++]=arr[i];
        return newArr;
    }
    
//     数组转列表
    public ArrayList<Integer> arrToList(int[] arr){
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i=0;i<arr.length;i++)list.add(arr[i]);
        return list;
    }
    
//     交换数组中两个位置的值
    public void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}