package demo; import unit.Unit; public class Three extends Abs { public void sort() { Unit ss = new Unit(); int[] ar = ss.genRandomArray(10000,1000); for(int i=0; i<ar.length; i++){ System.out.print(" "+ar[i]); } System.out.println(" "); double gap = ar.length;//增量长度 int dk,sentinel,k; while(true){ gap = (int)Math.ceil(gap/2);//逐渐减小增量长度 dk = (int)gap;//确定增量长度 for(int i=0;i<dk;i++){ //用增量将序列分割,分别进行直接插入排序。随着增量变小为1,最后整体进行直接插入排序 for(int j=i+dk;j<ar.length;j = j+dk){ k = j-dk; sentinel = ar[j]; while(k>=0 && sentinel<ar[k]){ ar[k+dk] = ar[k]; k = k-dk; } ar[k+dk] = sentinel; } } //当dk为1的时候,整体进行直接插入排序 if(dk==1){ break; } } for(int i=0; i<ar.length; i++){ System.out.print(" "+ar[i]); } } }
java实现归并排序法
package demo; import unit.Unit; public class Five extends Abs { @Override public void sort() { Unit ss = new Unit(); int[] ar = ss.genRandomArray(1000000,1000000); for(int i=0; i<ar.length; i++){ System.out.print(" "+ar[i]); } System.out.println("dddddddddddddddddddddddd "); mergeSort(ar,0,ar.length-1); for(int i=0; i<ar.length; i++){ System.out.print(" "+ar[i]); } } private void mergeSort(int[] arr,int l ,int r){ if(l>=r){ return; } int mid = (l+r)/2; mergeSort(arr,l,mid); mergeSort(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[] aux = new int[r-l+1]; for(int i=l; i<=r; i++){ aux[i-l]=arr[i]; } int i =l,j=mid+1; for( int k=l ; k<=r ; k++){ //先判断索引的合法性 if( i>mid ){ arr[k] = aux[j-l]; j ++; }else if(j > r){ arr[k] = aux[i-l]; i++; } //对分成两边的数组进行比较 那个比较大就放入新的aux数组中 else if( aux[i-l] < aux[j-l] ){ arr[k] = aux[i-l]; i++; }else{ arr[k] = aux[j-l]; j++; } } } }
快速排序
package demo; import unit.Unit; import java.util.Random; public class Six extends Abs { @Override public void sort() { Unit ss = new Unit(); int[] ar = ss.genRandomArray(100,0); for(int i=0; i<ar.length; i++){ System.out.print(" "+ar[i]); } System.out.println("ddddddddddddddddddddddddd "); quitSort(ar,0,ar.length-1); for(int i=0; i<ar.length; i++){ System.out.print(" "+ar[i]); } } private void quitSort(int[] arr,int l,int r) { if(l >= r){ return; } int p = partition(arr,l,r); quitSort(arr, l,p-1); quitSort(arr,p+1,r); } private int partition(int[] arr,int l,int r){ int k = new Random().nextInt(r-l); k = k + l; swap(arr,l+1,k); 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,j,l); return j; } private void swap(int[] arr, int j,int l){ int tempF ; tempF = arr[j]; arr[j] = arr[l]; arr[l] = tempF; } }
三路排序
package demo; import unit.Unit; import java.util.Random; public class Eight extends Abs { @Override public void sort() { Unit ss = new Unit(); int[] ar = ss.genRandomArray(10000,0); for(int i=0; i<ar.length; i++){ System.out.print(" "+ar[i]); } System.out.println("ddddddddddddddddddddddddd "); quitSortThree(ar,ar.length); for(int i=0; i<ar.length; i++){ System.out.print(" "+ar[i]); } } private void quitSortThree(int[] arr,int n) { quitSortThreeWays(arr,0,n-1); } private void quitSortThreeWays(int[] arr,int l,int r){ if(l >= r){ return; } int k = new Random().nextInt(r-l); k = k + l; swap(arr,l+1,k); int v = arr[l]; int lt = l; int gt = r + 1; int i = l+1; while(i<gt){ if(arr[i]<v){ swap(arr,i,lt+1); lt++; i++; }else if(arr[i] > v){ swap(arr,i,gt-1); gt --; }else{ i++; } } swap(arr,l,lt); quitSortThreeWays(arr,l,lt-1); quitSortThreeWays(arr,gt,r); } private void swap(int[] arr, int j,int l){ int tempF ; tempF = arr[j]; arr[j] = arr[l]; arr[l] = tempF; } }