package work; import java.util.Random; public class SevenSort { public void bub(int[] arr){ for(int i=0;i<arr.length-1;i++){ boolean flat=false; for(int j=0;j<arr.length-i-1;j++){ if(arr[j]>arr[j+1]){ int temp; temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; flat=true; } } if(!flat==true){ break; } } } //堆排序 public void heapsort(int[] arr){ for(int i=(arr.length-1-1)/2;i>=0;i--){ siftDown(arr,i,arr.length); } for(int i=arr.length-1;i>0;i--){ swap(arr,0,i); siftDown(arr,0,i); } } private void siftDown(int[] arr, int i, int i1) { while(2*i+1<i1){ int j=2*i+1; if (j + 1 < i1 && arr[j+1]>arr[j]){ j=j+1; } if(arr[i]>=arr[j]){ break; }else{ swap(arr,i,j); i=j; } } } //插入排序 public void insert(int[] nums){ for(int i=1;i<nums.length;i++){ for(int j=i;j>0&&nums[j-1]>nums[j];j--){ swap(nums,j-1,j); } } } public void insertBS(int[] nums){ for(int i=1;i<nums.length;i++){ int left=0; int right=i; int val=nums[i]; while(left<right){ int mid=(left+right)>>1; if(val>=nums[mid]){ left=mid+1; }else { right=mid; } } for(int j=i;j>left;j--){ nums[j]=nums[j-1]; } nums[left]=val; } } //选择排序 public void selection(int[] arr){ 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; } } swap(arr,i,min); } } //希尔排序 public void shell(int[] arr){ int gap=arr.length>>1; while(gap>1){ insertionSort(arr,gap); gap/=2; } insertionSort(arr,1); } private void insertionSort(int[] arr, int grap) { for(int i=grap;i<arr.length;i++){ for(int j=i;j-grap>=0&&arr[j]<arr[j-grap];j=j-grap){ swap(arr,j,j-grap); } } } //归并排序 public void mergeSort(int[] arr) { mergeSortInternal(arr,0,arr.length - 1); } private void mergeSortInternal(int[] arr, int l, int r) { if (r - l<= 15) { insertBase(arr,l,r); return; } int mid = l + ((r - l) >> 1); mergeSortInternal(arr,l,mid); mergeSortInternal(arr,mid + 1,r); if (arr[mid] > arr[mid + 1]) { merge(arr,l,mid,r); } } private void merge(int[] arr, int l, int mid, int r) { int[] temp = new int[r - l + 1]; for (int i = l; i <= r; i++) { temp[i - l] = arr[i]; } int i = l; int j = mid + 1; for (int k = l; k <= r; k++) { if (i > mid) { arr[k] = temp[j - l]; j ++; }else if (j > r) { arr[k] = temp[i - l]; i ++; }else if (temp[i - l] <= temp[j - l]) { arr[k] = temp[i - l]; i ++; }else { arr[k] = temp[j - l]; j ++; } } } //快速排序 public void quickSort(int[] arr) { quickSortInternal(arr,0,arr.length - 1); } private void quickSortInternal(int[] arr, int l, int r) { if (r - l <= 15) { insertBase(arr,l,r); return; } int p = partition(arr,l,r); quickSortInternal(arr,l,p - 1); quickSortInternal(arr,p + 1,r); } private int partition(int[] arr, int l, int r) { // 随机化基准值 int randomIndex = random.nextInt(l,r); swap(arr,l,randomIndex); int v = arr[l]; int j = l; for (int i = l + 1; i <= r; i++) { if (arr[i] < v) { swap(arr,j + 1,i); j ++; } } swap(arr,l,j); return j; } private void insertBase(int[] arr,int l,int r) { for (int i = l + 1; i <= r; i++) { for (int j = i; j > l && arr[j] < arr[j - 1]; j--) { swap(arr,j,j-1); } } } private void swap(int[] arr,int i, int j) { int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } }
七大排序算法
最新推荐文章于 2024-10-16 16:55:28 发布