import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;//排序算法
public class test_04_22 {public static void swap(int[] nums, int i, int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}//冒泡排序-稳定public static void test1(int[] nums){for (int i=0;i<nums.length-1;i++){for (int j=0;j<nums.length-1-i;j++){if (nums[j]>nums[j+1]){swap(nums, j, j+1);}}}}//选择排序 每次选择最小的放入i的位置-不稳定public static void test2(int[] nums){for (int i=0;i<nums.length;i++){int minIndex = i;for (int j=i;j<nums.length;j++){if (nums[j]<nums[minIndex]){minIndex=j;}}if (minIndex!=i){swap(nums,minIndex,i);}}}//直接插入排序-稳定public static void test3(int[] nums){//假设前面是有序的for (int i=1;i<nums.length;i++){int target = nums[i];int j=i-1;for (;j>=0;j--){if (target<nums[j]){nums[j+1]=nums[j];}else{break;}}nums[j+1]=target;}}//希尔排序-不稳定public static void test4(int[] nums){int n = nums.length;for (int step=n/2;step>=1;step=step/2){for (int i=step;i<n;i++){int temp = nums[i];int j=i-step;for (;j>=0;j-=step){if (temp<nums[j]){nums[j+step]=nums[j];}else{break;}}nums[j+step]=temp;}}}//7 4 8//快速排序-不稳定public static void test5(int[] nums, int left, int right){if (left>=right){return;}int temp=nums[left];int i=left;int j=right;while (i<=j){if (nums[i]<=temp){i++;}else if (nums[j]>=temp){j--;}else{swap(nums,i++,j--);}}//将获取到的中间位置进行交换1nums[left]=nums[j];nums[j]=temp;test5(nums,left,j-1);test5(nums,j+1,right);}//归并排序-稳定public static int[] test6(int[] nums, int left, int right){if (left>=right){return new int[]{nums[left]};}int mid = (left+right)/2;int[] leftNum = test6(nums, left, mid);int[] rightNum = test6(nums, mid + 1, right);return merge(leftNum, rightNum);}private static int[] merge(int[] leftNum, int[] rightNum) {int[] newNums = new int[leftNum.length+rightNum.length];int i=0;int j=0;int k=0;while (i<leftNum.length&&j<rightNum.length){if (leftNum[i]<rightNum[j]){newNums[k++]=leftNum[i++];}else{newNums[k++]=rightNum[j++];}}while (i<leftNum.length){newNums[k++]=leftNum[i++];}while (j<rightNum.length){newNums[k++]=rightNum[j++];}return newNums;}//堆排序-不稳定public static void test7(int[] nums){int n = nums.length;//建立堆for (int i=n/2-1;i>=0;i--){operateK(nums,n,i);}//开始调整for (int i=0;i<n-1;i++){swap(nums, 0,n-i-1);//调整 此时为n-1个节点operateK(nums,n-i-1,0);}}//[7,4,8,9]public static void operateK(int[] nums, int n, int k){while (k<n/2){int largeIndex = k*2+1;if (k*2+2<n&&nums[k*2+2]>nums[largeIndex]){largeIndex=k*2+2;}if (nums[largeIndex]<=nums[k]){break;}swap(nums,largeIndex,k);k=largeIndex;}}//计数排序-稳定public static void test8(int[] nums){int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;for (int num : nums) {if (num < min) {min = num;}if (num > max) {max = num;}}int temp=0;if (min<0){temp=-min;}int[] newNums = new int[max+temp+1];for (int num : nums) {newNums[num + temp]++;}int k=0;//获取for (int i=0;i<newNums.length;i++){while (newNums[i]>0){nums[k++]=i-temp;newNums[i]--;}}System.out.println(Arrays.toString(nums));}////12 7 888//基数排序-稳定public static void test9(int[] nums){int max=Integer.MIN_VALUE;for (int num:nums){if (num>max){max=num;}}int i=0;//123//求出其的每一位while (max>0){radixSort(nums,i);i++;max=max/10;}}public static void radixSort(int[] nums, int k) {for (int i=0;i<nums.length-1;i++){for (int j=0;j<nums.length-i-1;j++){int m = k>=(nums[j]+"").length()?0:((nums[j]+"").charAt((nums[j]+"").length()-k-1)-48);int n = k>=(nums[j+1]+"").length()?0:((nums[j+1]+"").charAt((nums[j+1]+"").length()-k-1)-48);if (m>n){swap(nums,j,j+1);}}}}//桶排序-稳定public static void test10(int[] nums){int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;for (int num:nums){max=Math.max(max,num);min=Math.min(min,num);}int bucketNum = 10;//保证一定装够int bucketSize = (max-min)/bucketNum+1;List<List<Integer>> ls = new ArrayList<>();for (int i=0;i<bucketNum;i++){ls.add(new ArrayList<>());}for (int num : nums) {int index = (num - min) / bucketSize;ls.get(index).add(num);}int k=0;for (List<Integer> l : ls) {Collections.sort(l);for (Integer integer : l) {nums[k++] = integer;}}}public static void main(String[] args) {int[] nums = {7,4,8,9,3,2,4,4,2};test10(nums);System.out.println(Arrays.toString(nums));}
}