常見排序算法Java實現

僅僅給出代碼,也沒啥好說的

package com.demo.exercise;

public class MySort {

    public static void main(String[] args){
        int[] a = {5,1,12,3,125,50,66};
        for(int v : a){
            System.out.print(v + " ");
        }
        System.out.println();
        fastSort(a);
        for(int v : a){
            System.out.print(v + " ");
        }
        System.out.println();
    }
    
    //簡單選擇排序
    public static void selectSort(int[] a){
        int len = a.length;
        for(int i = 0; i < len; i++){
            int min = i;    //初始化min索引爲當前索引
            for(int j = i + 1; j < len; j++){    //與後面的比較
                if(a[j] < a[min]){    //如果後面下標對應的數值小於min下標對應的數值
                    min = j;        //後面下標值賦給min
                }
            }
            exchange(a, i, min);    //經過比較之後,交換當前的與最小的位置
            System.out.println((i+1) + "趟:");
            for(int v : a){
                System.out.print(v + " ");
            }
            System.out.println();
        }
    }
    
    //插入排序
    public static void insertSort(int[] a){
        int len = a.length;
        for(int i = 1; i < len; i++){
            for(int j = i; j > 0; j--){    //與前面的數比較
                if(a[j] < a[j - 1]){    //如果當前小於前面的
                    exchange(a, j, j - 1);//交換位置
                }
            }
            System.out.println((i) + "趟:");
            for(int v : a){
                System.out.print(v + " ");
            }
            System.out.println();
        }
        
    }
    
    //冒泡排序
    public static void bubbleSort(int[] a){
        int len = a.length;
        for(int i = 0; i < len - 1; i++){            //進行len-1次比較
            for(int j = 0; j < len - i - 1; j++){    //每一次中進行len-1-i次比較
                if(a[j] > a[j + 1]){
                    exchange(a, j, j + 1);
                }
            }
            System.out.println((i+1) + "趟:");
            for(int v : a){
                System.out.print(v + " ");
            }
            System.out.println();
        }
        
        //降序
//        int len = a.length;
//        for(int i = 0; i < len - 1; i++){            //進行len-1次比較
//            for(int j = 0; j < len - i - 1; j++){    //每一次中進行len-1-i次比較
//                if(a[j] > a[j + 1]){
//                    exchange(a, j, j + 1);
//                }
//            }
//        }
        
    }
    
    //希爾排序:數組越大,優勢越大(不是特別懂)
    public static void xierSort(int[] a){
        int len = a.length;
        int h = 1;
        while(h < len/3){
            h = 3*h + 1;
        }
        while(h >= 1){
            for(int i = h; i < len; i++){
                for(int j = i; j >= h; j -= h){
                    if(a[j] < a[j - h]){
                        exchange(a, j, j - h);
                    }
                }
            }
            h = h/3;
        }
    }
    
    //遞歸方法,歸併排序
    public static void mergeSort(int[] a, int low, int high){
        if(low < high){
            int mid = (low + high)/2;        //找到中間下標
            mergeSort(a, low, mid);            //對前半段再分割
            mergeSort(a, mid + 1, high);    //對後半段再分割
            merge(a, low, mid, high);        //排序&合併當前的兩段序列
        }
    }
    
    private static void merge(int[] array, int low, int mid, int high){
        int i, j, k, n1, n2;
        n1 = mid - low + 1;    //子序列1的大小
        n2 = high - mid;    //子序列2的大小
        int[] L = new int[n1];    //子序列1
        int[] R = new int[n2];    //子序列2
        
        //把數組前半段複製到子序列1:(k爲開始複製的下標)
        for(i = 0, k = low; i < n1; i++, k++){
            L[i] = array[k];
        }
        //把數組後半段複製到子序列2
        for(i = 0, k = mid + 1; i < n2; i++, k++){
            R[i] = array[k];
        }
        //分別掃描子序列1和子序列2,比較誰更小,誰就添加進數組
        for(k = low, i = 0, j = 0; i < n1 && j < n2; k++){
            if(L[i] < R[j]){    // < 升序 ; > 降序
                array[k] = L[i];
                i++;
            }else{
                array[k] = R[j];
                j++;
            }
        }
        //如果子序列1沒有掃描完,將其剩下的元素依次添加進數組
        if(i < n1){
            for(j = i; j < n1; j++,k++){
                array[k] = L[j];
            }
        }
        //子序列2也是如此
        if(j < n2){
            for(i = j; i < n2; i++,k++){
                array[k] = R[i];
            }
        }
    }
    
    //快速排序
    public static void fastSort(int[] a){
        int len = a.length;
        quickSort(a, 0, len - 1);
    }
    //實現
    private static void quickSort(int[] array, int low, int high){
        int i = low, j = high;
        int index;    //這個變量存儲基準數
        if(i >= j) return;
        index = array[i];
        while(i < j){    //直到i = j,循環結束
            // 從後向前找第一個小於index的數 
            while(i < j && array[j] >= index){    // 只要當前的數大於等於index就向前移動下標
                j--;    //向前移動
            }
            if(i < j){
                array[i++] = array[j];    //把找到的小於index的數賦值給i所在的位置,然後i向後移動一位
            }
            
            //前面代碼是把整個數組中小於index的數移動到數組前面
            //後面代碼是把整個數組中大於等於index的數移動到數組後面
            
            // 從前向後找第一個大於等於index的數 
            while(i < j && array[i] < index){    //只要當前的數小於index就向後移動下標
                i++;
            }
            if(i < j){
                array[j--] = array[i];    //把找到的大於等於index的數賦給j所在的位置,然後j向前移動一位
            }
        }
        array[i] = index;    //最後把index賦給i的位置,也可以寫爲j,因爲此時i = j
        quickSort(array, low, i - 1);    //分治思想:這個遞歸負責數組位置i前面部分的排序
        quickSort(array, i + 1, high);    //分治思想:這個遞歸負責數組位置i後面部分的排序
    }
    

    //交換
    private static void exchange(int[] a, int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    
}

 

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