publicclass heap {// 堆排序publicstaticint[]heapSort(int[] arr){int len = arr.length;if(len <2){returnnull;}// 构造大根堆buildMaxHeap(arr, len);// 不断地交换堆顶元素和当前堆中的最后一个元素, 并且不断地调整堆// 那么就可以得到一个从尾到头的递减序列, 从正向来看就是一个递增序列for(int i = len -1; i >0; i--){// 交换堆顶元素和当前堆中的最后一个元素swap(arr,0, i);// 调整堆
len--;heapify(arr,0, len);}return arr;}// 初始数据构造大根堆 (下沉)privatestaticvoidbuildMaxHeap(int[] arr,int len){// 从最后一个非叶子结点开始,依次向前// 当一个节点比其子节点小,则需要不断地向下进行比较和交换操作for(int i =(int)Math.floor(len /2); i >=0; i--){heapify(arr, i, len);}}// 调整堆中以第 i 个节点为 root 的子树privatestaticvoidheapify(int[] arr,int i,int len){// 第 i 个节点的左孩子int left =2* i +1;// 第 i 个节点的右孩子int right =2* i +2;// 一个节点如果有两个子节点,应当与两个子节点中最大那个节点进行交换int largest = i;if(left < len && arr[left]> arr[largest]){
largest = left;}if(right < len && arr[right]> arr[largest]){
largest = right;}if(largest != i){swap(arr, i, largest);// 继续调整堆中以 largest 为 root 的子树heapify(arr, largest, len);}}privatestaticvoidswap(int[] arr,int i,int j){int temp = arr[i];
arr[i]= arr[j];
arr[j]= temp;}}
publicclass radix {publicvoidradixSort(int[] arr){int max =findMax(arr,0, arr.length -1);for(int i =1; max / i >0; i = i *10){int[][] buckets =newint[arr.length][10];for(int j =0; j < arr.length; j++){int num =(arr[j]/ i)%10;
buckets[j][num]= arr[j];}int k =0;for(int j =0; j <10; j++){for(int l =0; l < arr.length; l++){if(buckets[l][j]!=0){
arr[k++]= buckets[l][j];}}}}}publicintfindMax(int[] arr,intL,intR){if(L==R){return arr[L];}else{int a = arr[L];int b =findMax(arr,L+1,R);//找出整体的最大值if(a > b){return a;}else{return b;}}}}
选择排序
publicclass select {publicvoidselectionSort(int[] arr){if(arr.length <2){return;}// 一共需要经过 arr.length - 1 轮的比较for(int i =0; i < arr.length -1; i++){// 找到待排序列中的最小元素int min = i;for(int j = i +1; j < arr.length; j++){if(arr[j]< arr[min]){// 记录目前能找到的最小元素的下标
min = j;}}// 将未排序序列中的最小元素存放到已排序序列的最后if(i != min){swap(arr, i, min);}}}privatevoidswap(int[] arr,int i,int j){int temp = arr[i];
arr[i]= arr[j];
arr[j]= temp;}}