八大經典排序算法(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;
    }
}

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