Java實現各種排序匯總

jopen 10年前發布 | 16K 次閱讀 Java Java開發

選擇排序、快速排序、希爾排序、堆排序不是穩定的排序算法,

冒泡排序、插入排序、歸并排序和基數排序是穩定的排序算法。

 

</h4>

那什么是穩定的排序算法呢?


就是在排序的過程中,相等的兩個數并不會在排列后中為位置發生次序發生顛倒


再看一下各排列算法的時間效率分析匯總:



排序法

平均時間

最差情形

穩定度

額外空間

備注

冒泡

O(n2)

    O(n2)

穩定

O(1)

n小時較好

選擇

O(n2)

O(n2)

不穩定

O(1)

n小時較好

插入

O(n2)

O(n2)

穩定

O(1)

大部分已排序時較好

基數

O(logRB)

O(logRB)

穩定

O(n)

B是真數(0-9)

R是基數(個十百)

希爾

O(nlogn)

O(ns) 1<s<2

不穩定

O(1)

s是所選分組

快速

O(nlogn)

O(n2)

不穩定

O(nlogn)

n大時較好

歸并

O(nlogn)

O(nlogn)

穩定

O(1)

n大時較好

O(nlogn)

O(nlogn)

不穩定

O(1)

n大時較好




一、冒泡排序
    /** 
     * 冒泡排序 
     *  
     * @author 陳雪桂 
     *  
     */  
    public class BubbleSort  
    {  

        public static void main(String[] args)  
        {  
            BubbleSort b = new BubbleSort();  

            int[] a = b.init(args);  

            a = b.bubbleSort(a);  

            System.out.print("排序結果: ");  
            b.print(a);  
        }  

        /** 
         * 初始化數組 
         *  
         * @param args 
         * @return 
         */  
        private int[] init(String args[])  
        {  
            int[] a = new int[args.length];  

            for (int i = 0; i < args.length; i++)  
            {  
                a[i] = Integer.valueOf(args[i]);  
            }  

            return a;  
        }  

        /** 
         * 排序核心部分 
         *  
         * @param a 
         * @return 
         */  
        private int[] bubbleSort(int[] a)  
        {  
            int temp;  
            for (int i = 0; i < a.length; i++)  
                for (int j = 0; j < a.length - i - 1; j++)  
                {  
                    if (a[j] > a[j + 1])  
                    {  
                        temp = a[j];  
                        a[j] = a[j + 1];  
                        a[j + 1] = temp;  
                    }  
                }  

            return a;  
        }  

        /** 
         * 打印 
         * @param a 
         */  
        private void print(int[] a)  
        {  
            for (int i = 0; i < a.length; i++)  
            {  
                System.out.print(a[i] + " ");  
            }  
        }  
    }  

二、選擇排序
    /** 
     * 選擇排序 
     *  
     * @author 陳雪桂 
     *  
     */  
    public class SelectionSort  
    {  

        public static void main(String[] args)  
        {  
            SelectionSort s = new SelectionSort();  

            int[] a = s.init(args);  

            a = s.selectionSort(a);  

            System.out.print("排序結果: ");  
            s.print(a);  
        }  

        /** 
         * 初始化數組 
         *  
         * @param args 
         * @return 
         */  
        private int[] init(String args[])  
        {  
            int[] a = new int[args.length];  

            for (int i = 0; i < args.length; i++)  
            {  
                a[i] = Integer.valueOf(args[i]);  
            }  

            return a;  
        }  

        /** 
         * 選擇排序核心 
         *  
         * @param a 
         * @return 
         */  
        private int[] selectionSort(int[] a)  
        {  
            int min;  
            int temp;  

            for (int i = 0; i < a.length; i++)  
            {  
                min = i;  

                for (int j = i + 1; j < a.length; j++)  
                {  
                    if (a[j] < a[min])  
                    {  
                        min = j;  
                    }  
                }  

                temp = a[i];  
                a[i] = a[min];  
                a[min] = temp;  
            }  

            return a;  
        }  

        /** 
         * 打印 
         *  
         * @param a 
         */  
        private void print(int[] a)  
        {  
            for (int i = 0; i < a.length; i++)  
            {  
                System.out.print(a[i] + " ");  
            }  

        }  
    }  

三、插入排序
    /** 
     * 插入排序 
     *  
     * @author Administrator 
     *  
     */  
    public class InsertSort  
    {  
        public static void main(String[] args)  
        {  
            InsertSort insertSort = new InsertSort();  

            int[] a = insertSort.init(args);  

            a = insertSort.insertSort(a);  

            System.out.print("排列順序: ");  

            insertSort.print(a);  
        }  

        // 初始劃排列數組  
        private int[] init(String[] args)  
        {  
            int[] j = new int[args.length];  
            for (int i = 0; i < args.length; i++)  
            {  
                j[i] = Integer.valueOf(args[i]);  
            }  

            return j;  
        }  

        // 增序排列  
        private int[] insertSort(int[] a)  
        {  
            int temp;  

            for (int i = 1; i < a.length; i++)  
            {  
                temp = a[i];  
                int j = i - 1;  

                for (; j >= 0 && a[j] > temp; j--)  
                {  
                    a[j + 1] = a[j];  
                }  

                a[j + 1] = temp;  
            }  

            return a;  

        }  

        private void print(int[] a)  
        {  
            for (int i = 0; i < a.length; i++)  
            {  
                System.out.print(a[i] + " ");  
            }  
        }  
    }  

四、基數排序

    /** 
     * 基數排序 平均時間復雜度:O(dn)(d即表示整形的最高位數)  
     * 空間復雜度:O(10n) (10表示0~9,用于存儲臨時的序列)  
     * 穩定性:穩定 
     *  
     * @author 陳雪桂 
     *  
     */  
    public class RadixSort  
    {  
        /** 
         * 最大數的位數 
         */  
        static int max_Pos = 2;  

        public static void main(String[] args)  
        {  

            RadixSort r = new RadixSort();  

            int[] a = r.init(args);  

            a = r.radixSort(a, a.length);  

            System.out.print("排列結果: ");  

            r.print(a);  

        }  

        /** 
         * 初始化數組 
         *  
         * @param args 
         * @return 
         */  
        private int[] init(String args[])  
        {  
            int[] a = new int[args.length];  

            for (int i = 0; i < args.length; i++)  
            {  
                a[i] = Integer.valueOf(args[i]);  
            }  

            return a;  
        }  

        private int[] radixSort(int[] data, int dataSize)  
        {  
            List<Integer>[] bucket = new ArrayList[10];  


            for (int pos = 1; pos <= max_Pos; pos++)  
            {  
                for (int i = 0; i < dataSize; i++)  
                {  
                    int num = getNumAtPos(data[i], pos - 1);  

                    if (null == bucket[num])  
                    {  
                        bucket[num] = new ArrayList<Integer>();  
                    }  
                    bucket[num].add(data[i]);  
                }  

                for (int i = 0, j = 0; i < 10; i++)  
                {  
                    for (int k = 0; bucket[i] != null && k < bucket[i].size(); k++)  
                    {  
                        data[j++] = bucket[i].get(k);  
                    }  

                    if (bucket[i] != null)  
                    {  
                        bucket[i].clear();  
                    }  
                }  
            }  

            return data;  
        }  

        /** 
         * 獲取當前位上數字 
         *  
         * @param num 
         * @param pos 
         * @return 
         */    
        private int getNumAtPos(int num, int pos)  
        {  
            int temp = 1;  

            for (int i = 0; i < pos; i++)  
            {  
                temp *= 10;  
            }  

            return (num / temp) % 10;  
        }  

        private void print(int[] a)  
        {  
            for (int i = 0; i < a.length; i++)  
            {  
                System.out.print(a[i] + " ");  
            }  
        }  
    }  

五、希爾排序

    /** 
     * 希爾排序 
     *  
     * @author 陳雪桂 
     *  
     */  
    public class ShellSort  
    {  
        public static void main(String[] args)  
        {  
            ShellSort s = new ShellSort();  

            int[] a = s.init(args);  

            a = s.shellSort(a);  

            System.out.print("排列順序 : ");  
            s.print(a);  
        }  

        /** 
         * 初始化數組 
         *  
         * @param args 
         * @return 
         */  
        private int[] init(String args[])  
        {  
            int[] a = new int[args.length];  

            for (int i = 0; i < args.length; i++)  
            {  
                a[i] = Integer.valueOf(args[i]);  
            }  

            return a;  
        }  

        /** 
         * 希爾排序核心1 
         *  
         * @param args 
         * @return 
         */  
        private int[] shellSort(int[] a)  
        {  
            for (int step = a.length / 2; step >= 1; step = step/2)  
            {  
                a = shellInsert(a, step);  
            }  

            return a;  
        }  


        /** 
         * 增序排列 
         *  
         * @param a 
         * @param step 
         * @return 
         */  
        private int[] shellInsert(int[] a, int step)  
        {  
            int min = 0;  

            for (int i = step; i < a.length; i++)  
            {  

                if (a[i] < a[i - step])  
                {  
                    min = a[i];  

                    int j;  

                    for (j = i - step; j >= 0 && a[j] > min; j -= step)  
                    {  
                        a[j + step] = a[j];  
                    }  

                    a[j + step] = min;  
                }  
            }  

            return a;  
        }  

        /** 
         * 打印 
         *  
         * @param a 
         */  
        private void print(int[] a)  
        {  
            for (int i = 0; i < a.length; i++)  
            {  
                System.out.print(a[i] + " ");  
            }  
        }  
    }  

六、快速排序

    /** 
     * 快速排序 
     *  
     * @author 陳雪桂 
     *  
     */  
    public class QuickSort  
    {  
        static int count = 0;  

        public static void main(String[] args)  
        {  
            QuickSort q = new QuickSort();  

            int[] list = new int[12];  

            for (int i = 0; i < args.length; i++)  
            {  
                list[i] = Integer.valueOf(args[i]);  
            }  

            q.quickSort(list, 0, list.length - 1);  

            System.out.print("排序順序: ");  
            for (int i = 0; i < list.length; i++)  
            {  
                System.out.print(list[i] + " ");  
            }  
            System.out.println("\n執行次數:" +count );  
        }  

        public void quickSort(int[] n, int from, int to)  
        {  
            if (from <= to)  
            {  
                int midSort = partition(n, from, to);  

                quickSort(n, from, midSort - 1);  
                quickSort(n, midSort + 1, to);  
            }  
            return;  
        }  

        public int partition(int[] n, int from, int to)  
        {  
            int i = from + 1;  
            int j = to;  
            int p = n[from];  

            while (i < j)  
            {  
                while (n[i] < p)  
                    i++;  
                while (n[j] > p)  
                    j--;  

                swap(n, i, j);  
                count ++;  
            }  


            // 判斷是否有必要撤銷最后一次交換,必要則不用在循環中加入邊界檢查條件  
            if(i != from+1 || j !=to)swap(n, i, j);  
            swap(n,from,j);  

            return j;  
        }  

        public void swap(int[] n, int i, int j)  
        {  
            int temp = n[i];  
            n[i] = n[j];  
            n[j] = temp;  
        }  
    }  

七、合并排序

    /** 
     * 合并排序 
     * @author 陳雪桂 
     * 
     */  
    public class MergeSort  
    {  
        public static void main(String[] args)  
        {  

            int[] list = new int[12];  

            for (int i = 0; i < args.length; i++)  
            {  
                list[i] = Integer.valueOf(args[i]);  
            }  

            list = new MergeSort().mergeSort(list, 0, list.length-1);  

            System.out.print("排列順序:  ");  
            for (int i = 0; i < list.length; i++)  
            {  
                System.out.print(list[i] + " ");  
            }  
        }  

        public int[] mergeSort(int[] list, int from, int to)   
        {  
            if (from != to)  
            {  
                int mid = (from + to) / 2;  

                mergeSort(list, from, mid);  
                mergeSort(list, mid + 1, to);  

                return merge(list, from, to);  
            }  

            return list;  
        }  

        public int[] merge(int[] list, int from, int to)  
        {  
            int i = from;  
            int mid = (from + to) / 2;  
            int j = mid + 1;  

            int[] a = new int[to - from + 1];  
            int count = 0;  

            while (i <= mid && j <= to)  
            {  
                if (list[i] < list[j])  
                {  
                    a[count++] = list[i++];  
                }  
                else  
                {  
                    a[count++] = list[j++];  
                }  

            }  

            // 把剩余部分都加進去  
            while (i <= mid)  
            {  
                a[count++] = list[i++];  
            }  
            while (j <= to)  
            {  
                a[count++] = list[j++];  
            }  

            for(int k=from; k<= to; k++)  
            {  
                list[k] = a[k-from];  
            }  

            return list;  
        }  
    }  


八、堆排序
/** 
 * 堆排序包括兩個步驟 (1)初始堆(堆的定義:(1)堆是一個完全二叉樹(2)根結點的值或者大于左右子樹的值或者小于左右子樹的值(3)左右子樹也是一個堆) 
 * (2)調整堆(當初始小頂堆之后,堆頂元素是最小的元素,取出最小的元素與最后一個元素相交換,再把剩下n-1個元素調整成堆,依次調整直到1為止) 
 * 非終端節點調整 初始堆時從n/2向上調整成堆 把第一個元素與最后一個元素交換之后從第1個元素開始調整成新堆 
 *  
 *  
 * 時間復雜度為O(nlogn) 輔助空間為O(1) 
 *  
 * @author 陳雪桂 
 *  
 */  
public class HeapSort  
{  
    public static void main(String[] args)  
    {  
        HeapSort h = new HeapSort();  

        int[] a = init(args);  

        heapSort(a);  

        System.out.print("排列順序: ");  

        print(a);  
    }  

    /** 
     * 初始化數組 
     *  
     * @param args 
     * @return 
     */  
    private static int[] init(String[] args)  
    {  
        int[] a = new int[args.length];  

        for (int i = 0; i < args.length; i++)  
        {  
            a[i] = Integer.valueOf(args[i]);  
        }  

        return a;  
    }  

    /** 
     * 堆排序核心部分 
     *  
     * @param num 
     */  
    private static void heapSort(int[] num)  
    {  
        int temp;  
        // 初始建堆從n/2開始向根調整  
        for (int i = num.length / 2 - 1; i >= 0; i--)  
        {  
            adjustHeap(num, i, num.length);// 初始堆過程  
        }  

        for (int i = num.length - 1; i > 0; i--)  
        {  
            // 將堆頂元素與i元素交換  
            temp = num[i];  
            num[i] = num[0];  
            num[0] = temp;  

            // 從num[1]到num[i-1]調整成新堆  
            adjustHeap(num, 0, i - 1);  
        }  

    }  

    /** 
     * 調整堆 
     *  
     * @param num 
     * @param s 
     *            調整開始父節點 
     * @param t 
     *            調整結尾的界限 
     */  
    private static void adjustHeap(int[] num, int s, int t)  
    {  

        int x = num[s];  

        // 從最下父節點 與子節點比較,一直向上進行調整  
        for (int j = 2 * s + 1; j <= t; j = 2 * j + 1)  
        {  
            // 找出較大者把較大者給num[i]  
            if (j < t && num[j] < num[j + 1])  
            {  
                j = j + 1;  
            }  

            if (j < t && x < num[j])  
            {  
                num[s] = num[j];  
                s = j;  
            }  
        }  

        num[s] = x;  
    }  

    /** 
     * 打印 
     *  
     * @param a 
     */  
    private static void print(int[] a)  
    {  
        for (int i = 0; i < a.length; i++)  
        {  
            System.out.print(a[i] + " ");  
        }  
    }  

}  
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!