Java实现基本排序算法

稳定排序算法性能比较

冒泡排序代码:

    /**
     * 冒泡排序
     * 
     * @param arr
     * @return
     */
    public int[] bubbleSort(int[] arr) {
        int temp;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        return arr;
    }

直接插入排序代码:

    /**
     * 直接插入排序
     * 
     * @param arr
     * @return
     */
    public int[] insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] < arr[i - 1]) {
                int temp = arr[i];
                int j = i;
                while (j > 0 && arr[j - 1] > temp) {
                    arr[j] = arr[j - 1];
                    j--;
                }
                arr[j] = temp;
            }
        }
        return arr;
    }

基数排序代码:

    /**
     * 基数排序,又称桶排序
     * 
     * @param arr
     * @return
     */
    public int[] radixSort(int[] arr, int d) {
        int k = 0;
        int n = 1;
        int m = 1; // 控制键值排序依据在哪一位
        int[][] temp = new int[10][arr.length]; // 数组的第一维表示可能的余数0-9
        int[] order = new int[10]; // 数组orderp[i]用来表示该位是i的数的个数
        while (m <= d) {
            for (int i = 0; i < arr.length; i++) {
                int lsd = ((arr[i] / n) % 10);
                temp[lsd][order[lsd]] = arr[i];
                order[lsd]++;
            }
            for (int i = 0; i < 10; i++) {
                if (order[i] != 0)
                    for (int j = 0; j < order[i]; j++) {
                        arr[k] = temp[i][j];
                        k++;
                    }
                order[i] = 0;
            }
            n *= 10;
            k = 0;
            m++;
        }
        return arr;
    }

 

不稳定排序算法性能比较

选择排序代码:

    /**
     * 选择排序
     * 
     * @param arr
     * @return
     */
    public int[] selectSort(int[] arr) {
        int temp;
        for (int i = 0; i < arr.length; i++) {
            int minus = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[i])
                    minus = j;
            }
            if (minus != i) {
                temp = arr[i];
                arr[i] = arr[minus];
                arr[minus] = temp;
            }
        }
        return arr;
    }

希尔排序代码:

    /**
     * 希尔排序
     */
    public int[] shllSort(int[] arr) {
        int dk = arr.length / 2;
        while (dk >= 1) {
            for (int i = 0; i < dk; i++) {
                for (int j = i + dk; j < arr.length; j = j + dk) {
                    if (arr[j] < arr[j - dk]) {
                        int temp = arr[j];
                        int k = j;
                        while (k > i && arr[k - dk] > temp) {
                            arr[k] = arr[k - dk];
                            k = k - dk;
                        }
                        arr[k] = temp;
                    }
                }
            }
            dk = dk / 2;
        }

        return arr;
    }
}

快速排序代码:

    /**
     * 快速排序
     * 
     * @param arr
     *            待排序数组
     * @param left
     *            待排序数组左边界
     * @param right
     *            待排序数组右边界
     * @return
     */
    public int[] quickSort(int[] arr, int left, int right) {
        int temp;
        if (left < right) {
            int s = arr[left];
            int i = left;
            int j = right;
            while (true) {
                while (i + 1 < arr.length && arr[++i] < s)
                    ;
                while (j - 1 > -1 && arr[--j] > s)
                    ;
                if (i >= j)
                    break;
                else {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
            arr[left] = arr[j];
            arr[j] = s;
            quickSort(arr, left, j - 1);
            quickSort(arr, j + 1, right);
        }
        return arr;
    }

    /**
     * 快速排序第二种实现方式
     * 
     * @param arr
     *            待排序数组
     * @param left
     *            待排序数组左边界
     * @param right
     *            待排序数组右边界
     * @return
     */
    public int[] quickSort2(int[] arr, int left, int right) {
        if (left < right) {
            int key = arr[left];
            int low = left;
            int high = right;
            while (low < high) {
                while (high > low && arr[high] >= key)
                    high--;
                arr[low] = arr[high];
                while (low < high && arr[low] <= key)
                    low++;
                arr[high] = arr[low];
            }
            arr[low] = key;
            quickSort2(arr, left, low - 1);
            quickSort2(arr, low + 1, right);
        }
        return arr;
    }

 

posted @ 2016-08-25 14:13  SaraMorning  阅读(238)  评论(0编辑  收藏  举报