基本排序算法(上):平均时间复杂度O(n^2)

先编写一些常用的函数:

/**
     * 交换i,j俩个位置的数
     * @param intArray
     * @param i
     * @param j
     */
    public void swap(int[] intArray, int i, int j) {
        int temp = intArray[i];
        intArray[i] = intArray[j];
        intArray[j] = temp;
    }

    /**
     * 返回最小值下标
     *
     * @param intArray 数组
     * @param len      寻找的长度
     * @return 该范围内的最小值
     */
    public int minSubScript(int[] intArray, int len) {
        if (intArray.length == 0) return -1;
        int minSub = 0;
        for (int i = 1; i < len; i++) minSub = intArray[minSub] < intArray[i] ? minSub : i;
        return minSub;
    }

    /**
     * 返回最大值下标
     *
     * @param intArray 目标数组
     * @param len      寻找的长度
     * @return 该范围内最大值下标
     */
    public int maxSubScript(int[] intArray, int len) {
        if (intArray.length == 0) return -1;
        int maxSub = 0;
        for (int i = 1; i < len; i++) maxSub = intArray[maxSub] > intArray[i] ? maxSub : i;
        return maxSub;
    }

    /**
     * 递归返回数组最小值
     *
     * @param intArray 目标数组
     * @param len      寻找的长度
     * @return 该长度范围内的最小值
     */
    public int findTheMin(int[] intArray, int len) {
        if (len == 1) return intArray[0];
        int nextLevelMin = findTheMin(intArray, len - 1);
        return Math.min(intArray[len - 1], nextLevelMin);
    }

    /**
     * 递归返回数组最大值
     *
     * @param intArray 目标数组
     * @param len      寻找的长度
     * @return 该长度范围内的最大值
     */
    public int findTheMax(int[] intArray, int len) {
        if (len == 1) return intArray[0];
        int nextLevelMin = findTheMin(intArray, len - 1);
        return Math.max(intArray[len - 1], nextLevelMin);
    }

冒泡排序

/**
     * 冒泡排序,将大的数慢慢冒出,每次冒出的数字下标此处称作游标
     *
     * @param intArray 目标数组
     * @return 排序后的数组
     */
    public int[] bubbleSort(int[] intArray) {
        for (int i = 0; i < intArray.length; i++) { //冒泡的次数
            for (int j = 1; j < intArray.length - i; j++) {//游标的位置,游标的最大位置即冒泡的终点
                //每次比较要进行的操作
                if (intArray[j - 1] > intArray[j]) swap(intArray, j, j - 1);
            }
        }
        return intArray;
    }

选择排序

/**
     * 选择排序,在未拍序列中选择最大的一个数字放入未排序列的末尾
     *
     * @param intArray 目标数组
     * @return 排序后的数组
     */
    public int[] selectSort(int[] intArray) {
        for (int i = intArray.length - 1; i > 0; i--) {//需要选择放入的位置,第intArray[0]位置不用放
            swap(intArray, i, maxSubScript(intArray, i));
        }
        return intArray;
    }

插入排序

/**
     * 插入排序,从头依次检查每个位置的数,插入到其前面最适当的位置
     *
     * @param intArray  目标数组
     * @return 结果数组
     */
    public int[] insertSort(int[] intArray) {
        for (int i = 1; i < intArray.length; i++) {
            int temp = intArray[i];//要插入的值
            int m = i;//拷贝需多次赋值变量
            while (m != 0 && intArray[m - 1] > temp) {
                intArray[m] = intArray[m - 1];
                m--;
            }
            intArray[m] = temp;
        }
        return intArray;
    }

 

发布了58 篇原创文章 · 获赞 75 · 访问量 6661

猜你喜欢

转载自blog.csdn.net/qq_42013035/article/details/103506207
今日推荐