常见的几种排序方法实现

常见的几种排序方法:冒泡排序、选择排序、插入排序、选择排序
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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值