Java实现各种排序算法

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

java实现各种排序算法,包括冒泡、快速排序、堆排序、插入排序等。

/**
 * 
 */
package sortAlgorithm;

import java.io.File;
import java.io.IOException;
import java.sql.Time;
import java.util.Random;

/**
 * @author sky
 * 该类给出各种排序算法
 *
 */

public class sort{
    private static Integer[] elem(int n){
        int N=n;
        Random random=new Random();
        Integer elem[]=new Integer[N];
        for (int i=0;i<N;i++){
            elem[i]=random.nextInt(1000);
        }
        return elem;
    }
    public static void main (String Args[]) throws InterruptedException{
        int n=30000;
        Integer elem[]=elem(n);
        long start,end;

        class sort0 extends Thread{
            Integer elem[];
            int n;
            sort0(Integer elem[],int n){
                this.elem=elem;
                this.n=n;
            }
            public void run(){
                System.out.println("线程启动");
                straightInsertSort(elem,n);
            }
        }

        elem=elem(n);
        start=System.currentTimeMillis();
        sort0 s1=new sort0(elem,n);

        elem=elem(n);
        sort0 s2=new sort0(elem,n);
        elem=elem(n);
        sort0 s3=new sort0(elem,n);
        elem=elem(n);
        sort0 s4=new sort0(elem,n);
        elem=elem(n);
        sort0 s5=new sort0(elem,n);
        s1.start();
        s2.start();
        s3.start();
        s4.start();
        s5.start();
        s2.join();
        s1.join();
        s3.join();
        s4.join();
        s5.join();
        System.out.println("多线程简单插入排序:");
        end=System.currentTimeMillis();

        System.out.println(end-start);

        elem=elem(n);
        start=System.currentTimeMillis();
        straightInsertSort(elem,n);
        end=System.currentTimeMillis();
        System.out.println("简单插入排序:");
        System.out.println(end-start);

        elem=elem(n);
        start=System.currentTimeMillis();
        shellSort(elem,n);
        end=System.currentTimeMillis();
        System.out.println("希尔排序:");
        System.out.println(end-start);

        elem=elem(n);
        start=System.currentTimeMillis();
        bubbleSort(elem,n);
        end=System.currentTimeMillis();
        System.out.println("冒泡排序:");
        System.out.println(end-start);

        /*
        elem=elem(n);
        start=System.currentTimeMillis();
        quickSort(elem,n);
        end=System.currentTimeMillis();
        System.out.println("快速排序:");
        System.out.println(end-start);*/

        elem=elem(n);
        start=System.currentTimeMillis();
        simpleSelectionSort(elem,n);
        end=System.currentTimeMillis();
        System.out.println("简单选择排序:");
        System.out.println(end-start);

        elem=elem(n);
        start=System.currentTimeMillis();
        heapSort(elem,n);
        end=System.currentTimeMillis();
        System.out.println("堆排序:");
        System.out.println(end-start);

        elem=elem(n);
        start=System.currentTimeMillis();
        mergeSort(elem,n);
        end=System.currentTimeMillis();
        System.out.println("归并排序:");
        System.out.println(end-start);
    }

    //显示排序结果
    public static <T extends Comparable<? super T>> void show(T[] elem,int n){
        for (int i=0;i<n;i++){
            System.out.print(elem[i]);
            System.out.print(' ');
        }
        System.out.println();
    }
    //交换元素
    private static <T extends Comparable<? super T>> void swap(T[] elem,int i,int j){
        T tmp=elem[i];
        elem[i]=elem[j];
        elem[j]=tmp;
    }
    //直接插入排序法,复杂度为O(n^2)
    public static <T extends Comparable<? super T>> void straightInsertSort (T elem[],int n){
        for (int i=1;i<n;i++){
            T e=elem[i];
            int j;
            for (j=i-1;j>=0 && e.compareTo(elem[j])<0;j--){
                elem[j+1]=elem[j];
            }
            elem[j+1]=e;
        }
    }
    //shell插入排序算法,复杂度为O(n^1.5)
    private static <T extends Comparable<? super T>> void  shellInsertHelp(T elem[],int n,int incr){
        for (int i=incr;i<n;i++){
            T e=elem[i];
            int j=i-incr;
            for (;j>=0 && e.compareTo(elem[j])<0;j=j-incr){
                elem[j+incr]=elem[j];
            }
            elem[j+incr]=e;

        }
    }
    public static <T extends Comparable<? super T>> void shellSort(T elem[],int n ){
        for (int incr=n/2;incr>0;incr=incr/2){
            shellInsertHelp(elem,n,incr);
        }
    }
    //冒泡排序算法,时间复杂度为O(n^2)
    public static <T extends Comparable<? super T>> void bubbleSort(T elem[],int n){
        for (int i=n-1;i>0;i--){
            for (int j=0;j<i;j++){
                if (elem[j].compareTo(elem[i])>0){
                    swap(elem,i,j);
                }
            }
        }
    }
    //快速排序算法,时间复杂度为O(n*log(n))
    private static <T extends Comparable<? super T>> int partition(T elem[],int low,int high){
        while (low<high){
            for (;elem[high].compareTo(elem[low])>=0 && low<high;high--);
            swap(elem,high,low);
            for (;elem[high].compareTo(elem[low])>=0 && low<high;low++);
            swap(elem,high,low);
        }
        return low;
    }
    private static <T extends Comparable<? super T>> void quickSortHelp(T elem[],int low,int high){
        if (low<high){
            int pivot=partition(elem,low,high);
            quickSortHelp(elem,low,pivot-1);
            quickSortHelp(elem,pivot+1,high);
        }
    }
    public static <T extends Comparable<? super T>> void quickSort(T elem[],int n){
        quickSortHelp(elem,0,n-1);
    }
    //简单选择排序算法,时间复杂度为O(n^2)
    public static <T extends Comparable<? super T>> void simpleSelectionSort(T elem[],int n){
        for (int i=0;i<n-1;i++){
            int lowIdx=i;
            for (int j=i+1;j<n;j++){
                if (elem[lowIdx].compareTo(elem[j])>0)
                    lowIdx=j;
            }
            swap(elem,lowIdx,i);
        }
    }
    //堆排序,时间复杂度为O(n*log(n))
    private static <T extends Comparable<? super T>> void heapAdjust(T elem[],int low,int high){
        for (int i=low,lhs=2*i+1 ;lhs<=high;lhs=2*i+1){
            if (lhs<high && elem[lhs].compareTo(elem[lhs+1])<0)lhs++;
            if (elem[i].compareTo(elem[lhs])<0){
                swap(elem,i,lhs);
                i=lhs;
            }else break;
        }
    }
    public static <T extends Comparable<? super T>> void heapSort(T elem[],int n){
        //初始化堆
        for (int i=(n-2)/2;i>=0;i--){
            heapAdjust(elem,i,n-1);
        }
        swap(elem,0,n-1);
        //排序
        for (int i=n-2;i>0;--i){
            heapAdjust(elem,0,i);
            swap(elem,0,i);
        }
    }
    //归并排序算法,时间复杂度为O(n*log(n))
    private static <T extends Comparable<? super T>> void simpleMerge(T elem[],T tmpElem[],int low ,int mid, int high){
        int i=low,j=mid+1,k=low;
        for (;i<=mid && j<=high;k++){
            if (elem[i].compareTo(elem[j])<=0)
                tmpElem[k]=elem[i++];
            else 
                tmpElem[k]=elem[j++];
        }
        for (;i<=mid;i++){
            tmpElem[k++]=elem[i];
        }
        for (;j<=high;j++){
            tmpElem[k++]=elem[j];
        }

        for (;low<=high;low++){
            elem[low]=tmpElem[low];
        }
    }
    private static <T extends Comparable<? super T>> void mergeHelp(T elem[],T tmpElem[],int low ,int high){
        if (low < high){
            int mid=(low+high)/2;
            mergeHelp(elem,tmpElem,low,mid);
            mergeHelp(elem,tmpElem,mid+1,high);
            simpleMerge(elem,tmpElem,low,mid,high);
        }
    }
    public static <T extends Comparable<? super T>> void mergeSort(T elem[],int n){
        T[] tmpElem=(T[])new Comparable[n];
        mergeHelp(elem,tmpElem,0,n-1);
    }
}

标签: swap

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:使用jdbc连接SQLite数据库的示例代码

下一篇:jQuery 获取DOM节点的两种方式