java 希尔排序 归并排序 快速排序 三路快速排序

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;
    }
}

  

原文地址:https://www.cnblogs.com/smallteeth/p/9984077.html