zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    Ch5 关联式容器(上)
    Ch4 序列式容器(下)
    Ch4 序列式容器(上)
    DNN模型学习笔记
    关于换博客的说明
    睡前一小时数学之导数的学习与证明
    OpenJudge 666:放苹果 // 瞎基本DP
    OpenJudge 2990:符号三角形 解析报告
    OpenJudge1700:八皇后问题 //不属于基本法的基本玩意
    BZOJ1088扫雷Mine 解析报告
  • 原文地址:https://www.cnblogs.com/SaraMoring/p/5806578.html
Copyright © 2011-2022 走看看