1. 程式人生 > >Java排序程式碼

Java排序程式碼

public class Sort {
    public static void main(String[] args) {
        int[] data={3,6,8,3,2,45,7,567,5,12,234,3465,75,543,2,25,3,4,57,8,78,33,7,43,86,444};
        int[] outData = quickSort(data,0,data.length-1);
        showData(outData);
    }

    //氣泡排序
    public static int[] bubbleSort(int[] data){
        int temp;
        for (int i=0;i<data.length;i++){
            for (int j=data.length-1;j>i;j--){  //注意j--
                if (data[j]<data[j-1]){      //data[j]<data[j-1]的比較
                    temp=data[j-1];
                    data[j-1]=data[j];
                    data[j]=temp;
                }
            }
        }
        return data;
    }

    //選擇排序
    public static int[] selectSort(int[] data){
        int min,temp;
        for (int i=0;i<data.length;i++){
            min=i;      //min的初始化
            for (int j=i+1;j<data.length;j++){
                if (data[j]<data[min]){
                    min=j;
                }
            }
            if (min!=i){
                temp=data[i];
                data[i]=data[min];
                data[min]=temp;
            }
        }
        return data;
    }

    //插入排序
    public static int[] insertSort(int[] data){
        int temp,j;
        for (int i=0;i<data.length-1;i++){
            if (data[i]>data[i+1]){
                temp=data[i+1];
                for (j=i;j>=0 && data[j]>temp ;j--){    //j--的原因在於從後往前挪移資料
                    data[j+1]=data[j];
                }
                data[j+1]=temp;     //注意上一個for迴圈最後j--,所以j+1
            }
        }
        return data;
    }

    //希爾排序
    public static int[] shellSort(int[] data){
        int temp;
        int jump=data.length/2;     //jump作為一個階段
        while (jump!=0){
            for (int i=jump;i<data.length;i++){     //i從jump開始迴圈
                if (data[i]<data[i-jump]){      //插入排序的變形
                    temp=data[i];
                    int j;
                    for (j=i-jump;j>=0 && data[j]>temp;j-=jump){
                        data[j+jump]=data[j];
                    }
                    data[j+jump]=temp;
                }
            }
            jump=jump/2;
        }
        return data;
    }

    //堆排序1
    public static int[] headSort(int[] data){
        //此迴圈的目的是將非葉節點排序成完整的大頂堆
        for (int i=data.length/2-1;i>=0;i--){   //for迴圈從data.length/2-1到0
            headAdjust(data,i,data.length-1);
        }
        //次迴圈的目的是將data[0]與data[i]交換保證data[i]是最大的
        for (int i=data.length-1;i>0;i--){
            int temp=data[0];   //將data[0]與data[i]交換
            data[0]=data[i];
            data[i]=temp;
            headAdjust(data,0,i-1); //排序從0到i-1的資料
        }
        return data;
    }

    //堆排序2
    public static void headAdjust(int[] data,int start,int end){
        int temp=data[start];
        for (int i=2*start+1;i<=end;i=2*i+1){
            if (i+1<=end && data[i]<data[i+1]){
                i++;
            }
            if (data[i]<=temp){
                break;
            }
            data[start]=data[i];
            start=i;
        }
        data[start]=temp;
    }

    //快速排序1
    public static int[] quickSort(int[] data,int low,int high){
        if (low<high){
            int partition = quickSortPartition(data,low,high);  //獲取樞紐值
            quickSort(data,low,partition-1);    //遞迴至low>=high
            quickSort(data,partition+1,high);
        }
        return data;
    }

    //快速排序2
    public static int quickSortPartition(int[] data,int low,int high){
        int pivot=data[low];       //將data[low]作為預設的樞紐記錄
        while (low<high){
            while (low<high && data[high]>=pivot)   //注意此節點是while迴圈,
                high--;     //在data[high]>=pivot時是正確的排序,所以移動high的值
            int[] data1 = swap(data, low, high);
            while (low<high && data[low]<=pivot)
                low++;
            int[] data2 = swap(data1, low, high);
        }
        return low;
    }

    //交換num1和num2的資料
    public static int[] swap(int[] data,int num1,int num2){
        int temp=data[num1];
        data[num1]=data[num2];
        data[num2]=temp;
        return data;
    }

    //列印資料
    public static void showData(int[] data){
        System.out.print("[ ");
        for(int i:data){
            System.out.print(i);
            System.out.print(" ");
        }
        System.out.print("]");
    }
}