美文网首页
常见的几种排序方法实现

常见的几种排序方法实现

作者: 花花是男神 | 来源:发表于2018-11-19 19:12 被阅读0次

    常见的几种排序方法:冒泡排序、选择排序、插入排序、选择排序
    1、冒泡排序:每次比较相邻的像个数,值小的往前冒泡,时间复杂度O(n2)
    2、选择排序:每次选择最小的一个数放在前面,时间复杂度O(n2)
    3、插入排序:每个数插入前面的有序数列中,时间复杂度O(n2)
    4、选择排序:利用递归方法,不断将小于某个数的数字放左边,大于这个数的放右边O(N*logN)

    代码如下:

    public class test {
    
        public static void main(String[] args) {
            int[] num = new int[]{9, 3, 1, 5, 7, 2, 4, 8, 6, 10,14,11,12};
    //        maoPao(num);
    //        select(num);
    //        insert(num);
            quick(num, 0, num.length-1);
    
            for (int i = 0; i < num.length - 1; i++) {
                System.out.printf(num[i] + "");
            }
    
        }
    
    
        /**
         * 冒泡排序
         *
         * @param num
         * @return
         */
        private static int[] maoPao(int[] num) {
            if (num == null || num.length <= 0) {
                return null;
            }
    
            if (num.length == 1) {
                return num;
            }
    
            int temp;
            boolean flag = true; // 标志位  有改动
            for (int i = 0; i < num.length - 1; i++) {
                flag = true;
                //从最后一个开始向前冒泡
                for (int j = num.length - 1; j > 0; j--) {
                    if (num[j] < num[j - 1]) {
                        //大的排后 小的向前冒泡
                        temp = num[j];
                        num[j] = num[j - 1];
                        num[j - 1] = temp;
                        flag = false;
                    }
                }
    
                if (flag) {
                    //一个循环都没有冒泡行为则已排好序,无需再循环
                    return num;
                }
            }
            return num;
        }
    
        /**
         * 选择排序
         *
         * @param num
         */
        private static void select(int num[]) {
            if (!check(num))
                return;
    
            int currentIndex = 0;
            int temp;
            for (int i = 0; i < num.length - 1; i++) {
    
                currentIndex = i;
                //每次循环选择最小数的位置下标
                for (int j = i; j < num.length - 1; j++) {
                    if (num[j] < num[currentIndex]) {
                        currentIndex = j;
                    }
                }
                //如果有最小的则替换
                if (currentIndex != i) {
                    temp = num[i];
                    num[i] = num[currentIndex];
                    num[currentIndex] = temp;
                }
            }
        }
    
        /**
         * 插入查询
         *
         * @param num
         */
        private static void insert(int[] num) {
            if (!check(num)) {
                return;
            }
    
            int temp;
            for (int i = 0; i < num.length - 1; i++) {
                for (int j = i + 1; j > 0; j--) {
                    if (num[j] < num[j - 1]) {
                        temp = num[j - 1];
                        num[j - 1] = num[j];
                        num[j] = temp;
                    } else {
                        break;
                    }
                }
            }
        }
    
        /**
         * 快速排序
         *
         * @param num
         */
        private static void quick(int[] num, int l, int r) {
            if (!check(num) || l >= r)
                return;
    
            int i = l;
            int j = r;
            int key = num[l];
    
    
            while (i < j) {
                //大的放右边
                while (i < j && num[j] >= key) {
                    j--;
                }
    
                if (i < j) {
                    num[i] = num[j];
                    i++;
                }
    
                //小的放左边
                while (i < j && num[i] < key) {
                    i++;
                }
    
                if (i < j) {
                    num[j] = num[i];
                    j--;
                }
            }
            num[i] = key;
            quick(num, l, i - 1);
            quick(num, i + 1, r);
        }
    
        private static boolean check(int num[]) {
            if (num == null || num.length <= 0) {
                return false;
            }
    
            if (num.length == 1) {
                return false;
            }
            return true;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:常见的几种排序方法实现

          本文链接:https://www.haomeiwen.com/subject/vvgafqtx.html