八大经典排序算法(java)

package com.算法.排序;

public class 冒泡排序 {
   // 时间复杂度 :O(n2);
    public static void main(String[] args){
        int[] array = new int[100000];
        for(int i=0;i<array.length;i++){
            array[i] = (int)(Math.random()*200000);
        }
        long t1 = System.currentTimeMillis();
        array = sort01(array);
        long t2 = System.currentTimeMillis();
        for(int i=0,j=1;i<array.length;j++,i++){
            System.out.print(array[i]+"  ");
            if(j%10==0){
                System.out.println();
            }
        }
        System.out.println("冒泡排序算法耗费"+(t2-t1)+"毫秒");
    }
    public static int[] sort01(int[] array){ //冒泡排序
        boolean flag = false ; //做标记进行优化
        for(int i=0;i<array.length-1;i++){
            for(int j=0;j<array.length-1-i;j++){
                if(array[j]>array[j+1]){
                    flag=true;
                    int temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                }
            }
            if(!flag){
                break;
            }else{
                flag=false;
            }
        }
        return array;
    }
}

package com.算法.排序;

public class 选择排序 {
    //时间复杂度:O(n2)
    public static void main(String[] args){
        int[] array = new int[100000];
        for(int i=0;i<array.length;i++){
            array[i]=(int)(Math.random()*200000);
        }
        long t1 =System.currentTimeMillis();
        array = sort02(array);
        long t2 =System.currentTimeMillis();
        for(int i=0,j=1;i<array.length;j++,i++){
            System.out.print(array[i]+"  ");
            if(j%10==0){
                System.out.println();
            }
        }
        System.out.println("选择排序算法耗费"+(t2-t1)+"毫秒");
    }
    public static int[] sort02(int[] array){ //选择排序
        for(int i=0;i<array.length-1;i++){
            int min = array[i];
            int index = i;
            for(int j=i+1;j<array.length;j++){
                if(min>array[j]){
                    min=array[j];
                    index=j;
                }
            }
            if(i!=index){
                array[index] = array[i];
                array[i] = min;
            }
        }
        return array;
    }
}

package com.算法.排序;

public class 插入排序 {
    //时间复杂度:O(n2);
    public static void main(String[] args) {
        int[] array = new int[100000];
        for(int i=0;i<array.length;i++){
            array[i]=(int)(Math.random()*200000);
        }
        long t1 = System.currentTimeMillis();
        array = sort03(array);
        long t2 = System.currentTimeMillis();
        for(int i=0,j=1;i<array.length;j++,i++){
            System.out.print(array[i]+"  ");
            if(j%10==0){
                System.out.println();
            }
        }
        System.out.println("插入排序算法耗费"+(t2-t1)+"毫秒");
    }
    public static int[] sort03(int[] array){//插入排序
        for(int i=1;i<array.length;i++){ //待插入的数据所处的位置
            int index = i-1; //是否应该插入到该位置
            int data  = array[i]; //带插入的数据
            while(index>=0&&data<array[index]){
                array[index+1]=array[index];
                index--;
            }
            array[index+1]=data;
        }
        return array;
    }
}

package com.算法.排序;

public class 希尔排序 {
    //希尔排序的时间复杂度依赖于增量序列的选择,理论分析比较复杂.有实验结果表明,当n较大时,时间复杂度大约在O(n1.25)到O(n1.36)之间.
    public static void main(String[] args){
        int[] array = new int[100000];
        for(int i=0;i<array.length;i++){
          array[i] = (int) (Math.random()*200000);
        }
        long t1 = System.currentTimeMillis();
        array=sort04(array);
        long t2 = System.currentTimeMillis();
        for(int i=0,j=1;i<array.length;j++,i++){
            System.out.print(array[i]+"  ");
            if(j%10==0){
                System.out.println();
            }
        }
        System.out.println("希尔排序算法耗费"+(t2-t1)+"毫秒");
    }
    public static int[] sort04(int[] array){ //希尔排序
        for(int i=array.length/2;i>0;i/=2){ //将数据分为i组
            for(int j=i;j<array.length;j++){
                int index = j-i;
                int value = array[j];
                while(index>=0&&value<array[index]){
                    array[index+i] = array[index];
                    index -= i;
                }
                array[index+i] = value;
            }
        }
        return array;
    }
}

package com.算法.排序;

public class 快速排序 {
    //时间复杂度O(nlogn)
    public static void main(String[] args) {
        int[] array = new int[100000];
        for(int i=0;i<array.length;i++){
            array[i]=(int)(Math.random()*200000);
        }
        long t1 = System.currentTimeMillis();
        array=sort05(array,0,array.length-1);
        long t2 = System.currentTimeMillis();
        for(int i=0,j=1;i<array.length;j++,i++){
            System.out.print(array[i]+"  ");
            if(j%10==0){
                System.out.println();
            }
        }
        System.out.println("快速排序算法耗费"+(t2-t1)+"毫秒");
    }
    public static int[] sort05(int[] array,int head,int tail){ //快速排序
        int temp = array[head]; //我们选取最左边的数为基准数
        int i = head ;
        int j = tail ;
        while(i!=j){
            //我们使右边的数不小于基准数 使左边的数不大于基准数
            while(i<j&&array[j]>=temp){
                j--;
            }
            while(i<j&&array[i]<=temp){
                i++;
            }
            if(i<j){
                int t = array[j] ;
                array[j] = array[i];
                array[i] = t;
            }
        }
        array[head] = array[i];
        array[i] = temp ;
        if(i-1>head) array=sort05(array,head,i-1);
        if(j+1<tail) array=sort05(array,j+1,tail);
        return array;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章