publicstaticvoidradixSort(int[] arr){//定义一个二维数组,表示10个桶int[][] bucket =newint[10][arr.length];//定义一个一维数组,记录每个桶中每次放入数据的个数int[] bucketElementCounts =newint[10];//得到最大数的数的位数,即要进行的轮数int max = arr[0];for(int i =1; i < arr.length; i++){if(arr[i]> max){
max = arr[i];}}int maxLength =(max +"").length();for(int i =0, n =1; i < maxLength; i++, n *=10){//针对不同位数进行排序for(int j =0; j < arr.length; j++){//取出对应位的值int digitOfElement = arr[j]/ n %10;//放入对应桶中
bucket[digitOfElement][bucketElementCounts[digitOfElement]++]= arr[j];}//按照桶的顺序依次取出桶中的元素int index =0;for(int k =0; k < bucket.length ; k++){//如果桶中有数据,才取出放入原数组if(bucketElementCounts[k]!=0){for(int l =0; l < bucketElementCounts[k]; l++){
arr[index++]= bucket[k][l];}}//每一轮结束后,需要清空bucketElementCounts[]
bucketElementCounts[k]=0;}
System.out.println("第"+(i+1)+"轮后:"+Arrays.toString(arr));}}
publicstaticvoidheapSort(int[] arr){int temp =0;for(int i = arr.length/2-1; i >=0; i--){makeHeap(arr, i, arr.length-1);}for(int j = arr.length-1; j >0; j--){//交换
temp = arr[j];
arr[j]= arr[0];
arr[0]= temp;makeHeap(arr,0, j);}
System.out.println(Arrays.toString(arr));}/*
* @Description 完成将以i对应的非叶子节点的树调整成大顶堆
* @param arr 待调整的数组
* @param i 非叶子节点在数组中的索引
* @param length 调整的元素的个数,在逐渐减少
* @return void 将二叉树数组调整成大顶堆
**/privatestaticvoidmakeHeap(int[] arr,int i,int length){//取出当前元素的值int temp = arr[i];for(int k =(2*i+1); k < length; k=k*2+1){if(arr[k]< arr[k+1]&&(k+1)< length){//左子节点的值小于右子节点的值
k++;//k指向右子节点}if(arr[k]> temp){//子节点的值大于父节点的值
arr[i]= arr[k];//将大的值赋给父节点/当前节点
i = k;//i指向k继续循环比较}else{break;}}//for循环结束后,已经将以i为父节点的树的最大值放在了i的位置//将temp的值指向调整过后的位置
arr[i]= temp;}
2.9 计数排序
一种典型的空间换时间的方法,要求数据不能太稀疏,不然会造成大量的空间浪费
假设所有数据都小于1024,则创建一个int[] help = new int[1024],遍历原始数组,数组中的元素值为k,则就将help[k]的值加1,遍历完成后输出help中不为0的数据即可
publicstaticvoidcountSort(int[] arr){//假设所有的数据都小于1024int[] help =newint[1024];for(int i =0; i < arr.length; i++){
help[arr[i]]+=1;}for(int i =0; i < help.length; i++){int t = help[i];if(t !=0){for(int j =0; j < t; j++){
System.out.print(i +" ");}}}}