import java.util.Arrays; import java.util.Random; public class Sorts{ public static void main(String[] args) {
int testTime = 10000; int maxSize = 10000; int maxValue = 100; Boolean succeed = true; for (int i = 0; i < testTime; i++) { int[] arr1 = generateRandomArray(maxSize, maxValue); int[] arr2 = copyArray(arr1); long time=System.currentTimeMillis(); HeapSort(arr1); long time2=System.currentTimeMillis(); if(i==0){ System.out.println(time2-time); } comparator(arr2); if(i==0){ System.out.println(System.currentTimeMillis()-time2); } if (!isEqual(arr1, arr2)) { succeed = false; printArray(arr1); printArray(arr2); break; } } System.out.println(succeed ? "Nice!" : "Fucking fucked!"); } private static void MaoPaoSort(int []nums){ for (int i=nums.length-1;i>=0;i--){ for (int j=0;j<i;j++){ if(nums[j]>nums[j+1]){ swap(nums,j,j+1); } } } } private static void SelectSort(int []nums){ for (int i=0;i<nums.length;i++){ int min=nums[i]; for (int j=i+1;j<nums.length;j++){ if(nums[j]<min){ min=nums[j]; swap(nums,j,i); } } } } private static void InsertSort(int []nums){ for (int i=1;i<nums.length;i++){ for (int j=i;j>0&&nums[j]<nums[j-1];j--){ swap(nums,j,j-1); } } } private static void ShellSort(int [] nums){ int h=nums.length>>1; while(h>0){ for (int i=h;i<nums.length;i++){ for (int j=i;j-h>=0&&nums[j]<nums[j-h];j-=h) { swap(nums,j,j-h); } } h=h>>1; } } private static void MergerSort(int []nums){ help=new int[nums.length]; MergerSort(nums,0,nums.length-1); } private static void MergerSort(int []nums,int left,int right){ if(left>=right){ return; } int mid=left+((right-left)>>1); MergerSort(nums,left,mid); MergerSort(nums,mid+1,right); merger(nums,left,mid,right); } private static int []help; private static void merger(int []nums ,int left,int mid,int right){ int i=left,j=mid+1; for (int k=left;k<=right;k++){ if(i>mid){ help[k]=nums[j++]; } else if(j>right){ help[k]=nums[i++]; } else if(nums[i]>nums[j]){ help[k]=nums[j++]; } else{ help[k]=nums[i++]; }
} for (int k=left;k<=right;k++){ nums[k]=help[k]; }
} private static void MergerSortNoRecurse(int []nums){ help=new int[nums.length]; for (int sz=1;sz<nums.length;sz*=2){ for (int i=0;i<nums.length-sz;i+=2*sz){ int r=i+2*sz-1<nums.length-1?i+2*sz-1:nums.length-1; merger(nums,i,i+sz-1,r); } } } private static void QuickSort(int []nums,int l,int r){ if(l>r){ return; } swap(nums, l + (int) (Math.random() * (r - l + 1)), r); int []index=partition2(nums,l,r); QuickSort(nums,l,index[0]-1); QuickSort(nums,index[1]+1,r); } public static int partition1(int []nums ,int l,int r){ int base = l; int lo = l, hi = r; while (lo < hi) { while (nums[hi] >= nums[base] && lo < hi) { hi--; } while (nums[lo] <= nums[base] && lo < hi) { lo++; } if (lo < hi) { swap(nums, lo, hi); } } swap(nums, hi, base); return lo; } public static int[] partition2(int []arr ,int l,int r){ int less=l-1; int more=r; while(l<more){ if(arr[l]<arr[r]){ swap(arr,++less,l++); } else if(arr[l]>arr[r]){ swap(arr,--more,l); } else{ l++; } } swap(arr,more,r); return new int[]{less+1,more}; } private static void HeapSort(int []nums){ if(nums.length<2){ return; } for (int i=0; i<nums.length; i++) { heapInsert(nums,i); } int size= nums.length; swap(nums,size-1,0); size--; while(size>1){ heapIfy(nums,0,size); swap(nums,--size,0); } } private static void heapInsert(int []nums, int index){ while(nums[index]>nums[(index-1)/2]){ swap(nums,index,(index-1)/2); index=(index-1)/2; } } private static void heapIfy(int []nums,int index,int size){ int left=index*2+1; while(left<size){ int largest=left+1<size && nums[left]<nums[left+1] ?left+1:left; largest=nums[largest]>nums[index]?largest:index; if(largest==index){ break; } swap(nums,largest,index); index=largest; left=index*2+1; } } private static void swap(int []nums,int a,int b){ nums[a]=nums[a]^nums[b]; nums[b]=nums[a]^nums[b]; nums[a]=nums[a]^nums[b];
} public static void comparator(int[] arr) { Arrays.sort(arr); } public static int[] generateRandomArray(int maxSize, int maxValue) { int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); } return arr; } public static int[] copyArray(int[] arr) { if (arr == null) { return null; } int[] res = new int[arr.length]; for (int i = 0; i < arr.length; i++) { res[i] = arr[i]; } return res; } public static Boolean isEqual(int[] arr1, int[] arr2) { if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) { return false; } if (arr1 == null && arr2 == null) { return true; } if (arr1.length != arr2.length) { return false; } for (int i = 0; i < arr1.length; i++) { if (arr1[i] != arr2[i]) { return false; } } return true; } public static void printArray(int[] arr) { if (arr == null) { return; } for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } }
|