1. 程式人生 > >java 各類排序數組實現

java 各類排序數組實現

bre 表示 等於 最小 放置 對數 最大 最大值 完成後

代碼來源:好像叫《java常用算法手冊》

package sort;
 
/*堆排序:堆排序的關鍵是構造堆結構,即是構造一個完全二叉樹。每個節點應滿足條件:若升序,則父節點大於或等於左右子節點
 * 的數據,若降序則反之。在這裏選擇升序,則根節點為最大值。堆排序需要反復兩個步驟:構造堆結構和堆排序輸出。
 *“篩”運算來調整節點數據,以滿足堆結構條件。
 *“篩”運算:從最底層的父節點開始,比較其左右子節點,選取較大的值與父節點比較,若大於父節點,則該子節點與父節點交換。其他
 *節點也是如此,   知道所有父節點均大於子節點的值。
 *排序輸出:構造堆結構完成後,取最底層的節點,替換出根節點(最大值),將根節點保存至數組的最後位置。再進行構造堆結構,
 *排序輸出。如此反復,知道最後兩個數據比較完畢。排序也完成了。
 * 
 
*/ public class HeapSort { static final int SIZE = 10; static void heapSort(int a[],int n){ int i,j,h,k; int t; for(i=n/2-1;i>=0;i--){ while(2*i+1<n){ j=2*i+1;
if((j+1)<n){ if(a[j]<a[j+1]) j++; } if(a[i]<a[j]){ t= a[i]; a[i] = a[j]; a[j] = t; i=j; }
else{ break; } } } System.out.print("原數據構成的堆:"); for(h=0;h<n;h++){ System.out.print(" " + a[h]); } System.out.print("\n"); for(i=n-1;i>0;i--){ t = a[0]; a[0] = a[i]; a[i] = t; k = 0; while(2*k+1<i){ j=2*k+1; if((j+1)<i){ if(a[j]<a[j+1]){ j++; } } if(a[k] < a[j]){ t = a[k]; a[k] = a[j]; a[j] = t; k=j; } else{ break; } } System.out.print("第" + (n-i) + "步排序結果:"); for(h=0;h<n;h++){ System.out.print(" " + a[h]); } System.out.print("\n"); } } public static void main(String[] args) { int[] shuzu = new int[SIZE]; int i; for(i=0;i<SIZE;i++){ shuzu[i] = (int) (100+Math.random()*(100+1)); } System.out.println("排序前的數組為:"); for(i=0;i<SIZE;i++){ System.out.print(shuzu[i] + " "); } System.out.print("\n"); heapSort(shuzu, SIZE); System.out.println("排序後的數組為:"); for(i=0;i<SIZE;i++){ System.out.print(shuzu[i] + " "); } System.out.print("\n"); } }

package sort;
 
/*
 * 冒泡排序:對數組中的數據,依次比較相鄰兩個元素的大小,如1 2 比較 2 3 比較,依據升序或者降序,取大或小,交換位置
 * 對N個數據進行排序,都需要進行N-1次中間排序。冒泡排序缺點:效率不高。
 */
public class BubbleSort {
    static final int SIZE = 10;
     
    public static void bubbleSort(int[] a){
        int temp;
        for(int i=1;i<a.length;i++){
            for(int j = 0; j<a.length-i;j++){
                if(a[j] > a[j+1]){
                    temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] =temp;
                }
            }
            System.out.println("第" + i + "步排序結果:");
            for(int k = 0;k<a.length;k++){
                System.out.print( " " + a[k]);
            }
            System.out.println("\n");
        }
    }
 
    public static void main(String[] args) {
        int[] m = new int[SIZE];
        int i;
        for(i=0;i<SIZE;i++){
            m[i]=(int) (100 + Math.random()*(100+1));//產生隨機數初始化數組
        }
        System.out.println("排序前數組為:");
        for(i=0;i<SIZE;i++){
            System.out.print(m[i]+" ");
        }
        System.out.println("\n");
         
        bubbleSort(m);
        System.out.println("排序後數組為:");
        for(i=0;i<SIZE;i++){
            System.out.print(m[i]+ " ");
        }
        System.out.println("\n");
    }
 
}

package sort;
 
/*
 * 選擇排序:先從原始數組中選出一個最小的數據,將其與第一個位置的數據交換。然後接著從剩下的n-1中找出最小的,與第二
 * 個位置的數據交換。依次類推不斷重復,直到最後兩個數據完成交換。
 * 缺點:效率不高  都要執行N-1步
 */
public class SelectionSort {
    static final int SIZE = 10;
     
    public static void selectionSort(int[] m) {
        int temp;
        int index;
         
        for(int i = 0; i<m.length;i++){
            index = i;
             
            for(int j = i+1;j<m.length;j++){//找出最小數的index
                if(m[j]<m[index]){
                    index = j;
                }
                 
            }
            if(index !=i){//交換位置
                temp = m[i];
                m[i]=m[index];
                m[index] = temp;
            }
            System.out.println("第" + (i+1) + "步排序結果:");
            for(int k = 0;k<m.length;k++){
                System.out.print( " " + m[k]);
            }
            System.out.println("\n");
        }
         
    }
     
    public static void main(String[] args) {
        int[] m = new int[SIZE];
        int i;
        for(i=0;i<SIZE;i++){
            m[i]=(int) (100 + Math.random()*(100+1));//產生隨機數初始化數組
        }
        System.out.println("排序前數組為:");
        for(i=0;i<SIZE;i++){
            System.out.print(m[i]+" ");
        }
        System.out.println("\n");
         
        selectionSort(m);
        System.out.println("排序後數組為:");
        for(i=0;i<SIZE;i++){
            System.out.print(m[i]+ " ");
        }
        System.out.println("\n");
 
    }
 
     
 
}

package sort;
/*
 * Shell排序:
 * 1.將有n個元素的數組分成n/2個數字序列,第一個數據和第n/2+1個數據為一對.....
 * 2.一次循環使每個序列對排好序
 * 3.然後,再變為n/4個序列,再次排序
 * 4.不斷重復上述過程,隨著序列減少為最後一個,就完成了整個排序。
 * 具有較高的效率。
 */
public class ShellSort {
    static final int SIZE = 10;
     
    public static void shellSort(int[] m) {
        int i,j,h;
        int r,temp;
        int x = 0;
         
        for(r=m.length/2;r>=1;r/=2){
             
            for(i=r;i<m.length;i++){
                temp=m[i];
                j=i-r;
                while(j>=0&&temp<m[j]){
                    m[j+r]=m[j];
                    j-=r;
                }
                m[j+r]=temp;
            }
            x++;
            System.out.println("第" + x + "步排序結果:");
            for( h = 0;h<m.length;h++){
                System.out.print( " " + m[h]);
            }
            System.out.println("\n");
        }
    }
     
    public static void main(String[] args) {
        int[] m = new int[SIZE];
        int i;
        for(i=0;i<SIZE;i++){
            m[i]=(int) (100 + Math.random()*(100+1));//產生隨機數初始化數組
        }
        System.out.println("排序前數組為:");
        for(i=0;i<SIZE;i++){
            System.out.print(m[i]+" ");
        }
        System.out.println("\n");
         
        shellSort(m);
        System.out.println("排序後數組為:");
        for(i=0;i<SIZE;i++){
            System.out.print(m[i]+ " ");
        }
        System.out.println("\n");
    }
 
     
 
}

package sort;
 
/*
 * 快速排序(quicksort)流程:
 * 1.首先設定一個分界值,通過該分界值將數組分成左右兩部分。
 * 2.將大於等於分界值的數據集中到數組右邊,小於分界值的數據集中到數組的左邊。此時,左邊部分的所有元素都小於分界值,
 * 右邊部分的所有元素都大於等於分界值。
 * 3.然後,左邊和右邊的數據可以獨立排序。對於左側的數組數據,又可以取一個分界值,將該部分數據分成左右兩部分,同樣,
 * 左邊放置小值,右邊放置大值。右側數組數據同上。
 * 4.重復上述過程,可以看出,這是一個遞歸定義。通過遞歸將左側數據排好序後,再遞歸排後右側部分的順序。當左右兩個部分
 * 各個數據排序好後,整個數組的排序也就完成了。
 */
public class QuickSort {
     
    static final int SIZE = 18;
    static void quickSort(int[] arr,int left,int right){
         
        int f, t ;
        int rtemp,ltemp;
         
        rtemp = right;//
        ltemp = left;
        f= arr[(left+right)/2];
        while(ltemp < rtemp){
             
            while(arr[ltemp] < f){
                ++ltemp;
            }
            while(arr[rtemp] > f){
                --rtemp;
            }
            if(ltemp<=rtemp){
                t=arr[ltemp];
                arr[ltemp] = arr[rtemp];
                    arr[rtemp] = t;
                --rtemp;
                    ++ltemp;
            }
        }
        if(ltemp == rtemp){
            ltemp++;
        }
         
        if(left < rtemp){
            quickSort(arr,left,ltemp-1);
        }
        if(ltemp < right){
            quickSort(arr,rtemp+1,right);
        }
    }
     
    public static void main(String[] args) {
        int[] shuzu = new int[SIZE];
        int i;
         
        for(i=0;i<SIZE;i++){
            shuzu[i] = (int) (100+Math.random()*(100+1));
        }
         
        System.out.println("排序前的數組為:");
         
        for(i=0;i<SIZE;i++){
            System.out.print(shuzu[i] + " ");
        }
         
        System.out.print("\n");
         
        quickSort(shuzu, 0, SIZE-1);
         
        System.out.println("排序後的數組為:");
         
        for(i=0;i<SIZE;i++){
            System.out.print(shuzu[i] + " ");
        }
         
        System.out.print("\n");
    }
 
}

package sort;
 
/*
 * 插入排序:首先對數組的前兩個數據進行比較,接著將第三個數據域排好序的兩個數據比較,將第三個數據插入到合適的位置。
 * 然後,將第四個數據插入到已排好尋的三個數據中;不斷重復以上步驟,直到把最後一個數據插入到合適的位置。
 * 
 * 
 */
public class InsertionSort {
    static final int SIZE = 10;
     
    public static void insertionSort(int[] m) {
        int i,j,t;
        for(i=1;i<m.length;i++){
            t=m[i];//保存要插入的數據
            j=i-1;
            while(j>=0&&t<m[j]){
                m[j+1]=m[j];//要插入的數據比當前位置的數據小,當前位置的數據向後移一位。
                j--;//繼續向前查找是否有比要插入的數據大的數
            }
            m[j+1]=t;//跳出while循環表示t>=m[j],則要插入的位置為j+1;
             
            System.out.println("第" + i + "步排序結果:");
            for(int k = 0;k<m.length;k++){
                System.out.print( " " + m[k]);
            }
            System.out.println("\n");
        }
         
    }
 
    public static void main(String[] args) {
        int[] m = new int[SIZE];
        int i;
        for(i=0;i<SIZE;i++){
            m[i]=(int) (100 + Math.random()*(100+1));//產生隨機數初始化數組
        }
        System.out.println("排序前數組為:");
        for(i=0;i<SIZE;i++){
            System.out.print(m[i]+" ");
        }
        System.out.println("\n");
         
        insertionSort(m);
        System.out.println("排序後數組為:");
        for(i=0;i<SIZE;i++){
            System.out.print(m[i]+ " ");
        }
        System.out.println("\n");
    }
 
     
 
     
 
}

java 各類排序數組實現