publicstaticvoidcountSort(int[] nums){int maxNum = Integer.MIN_VALUE;int minNum = Integer.MAX_VALUE;for(int num : nums){
maxNum = num > maxNum ? num : maxNum;
minNum = num < minNum ? num : minNum;}int[] bucket =newint[maxNum - minNum +1];for(int i =0; i < bucket.length; i++)
bucket[i]=0;for(int num : nums){
bucket[num - minNum]++;}int index =0;for(int i =0; i < bucket.length; i++){while(bucket[i]>0){
nums[index++]= i + minNum;
bucket[i]--;}}}
基数排序
publicstaticvoidradixSort(int[] nums){int[][] bucket =newint[10][nums.length];int[] cnt =newint[10];int maxNum = Integer.MIN_VALUE;int minNum = Integer.MAX_VALUE;for(int num : nums){
maxNum = num > maxNum ? num : maxNum;
minNum = num < minNum ? num : minNum;}for(int n =1; n <= maxNum - minNum; n *=10){for(int num : nums){int digit =((num - minNum)/ n)%10;
bucket[digit][cnt[digit]++]= num;}int index =0;for(int i =0; i <10; i++){for(int j =0; j < cnt[i]; j++)
nums[index++]= bucket[i][j];
cnt[i]=0;}}}
堆排序
publicstaticvoidheapSort(int[] nums){//1.构建大顶堆for(int i = nums.length /2-1; i >=0; i--){//从第一个非叶子结点从下至上,从右至左调整结构adjustHeap(nums, i, nums.length);}//2.调整堆结构+交换堆顶元素与末尾元素for(int j = nums.length -1; j >0; j--){//将堆顶元素与末尾元素进行交换int tmp = nums[0];
nums[0]= nums[j];
nums[j]= tmp;adjustHeap(nums,0, j);//重新对堆进行调整}}publicstaticvoidadjustHeap(int[] nums,int i,int length){int tmp = nums[i];//先取出当前元素ifor(int k = i *2+1; k < length; k = k *2+1){//从i结点的左子结点开始,也就是2i+1处开始if(k +1< length && nums[k]< nums[k +1]){//如果左子结点小于右子结点,k指向右子结点
k++;}if(nums[k]> tmp){//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)
nums[i]= nums[k];
i = k;}else{break;}}
nums[i]= tmp;//将tmp值放到最终的位置}