0
点赞
收藏
分享

微信扫一扫

简单排序练习(插入冒泡选择, Java)

瑾谋 2022-04-19 阅读 129

冒泡排序

  • 冒泡排序, 最好情况时间复杂度O(n), 最坏情况时间复杂度O(n2), 平均情况时间复杂度O(n2)
  • 冒泡排序是稳定的排序算法
  • 冒泡排序是原地排序算法(空间复杂度O(1))
    /**
     * 冒泡排序
     *
     * @param value
     */
    public static void bubbleSort(int[] value) {
        for (int i = 0; i < value.length - 1; i++) {
            for (int j = i + 1; j < value.length; j++) {
                if (value[i] > value[j]) {
                //这里用了异或运算, 其实效果就是将i,j元素交换
                    value[i] = value[i] ^ value[j];
                    value[j] = value[i] ^ value[j];
                    value[i] = value[i] ^ value[j];
                }
            }
        }
    }

冒泡排序优化

    /**
     * 冒泡优化, 如果左边已经有序,
     * 就没必每次去遍历左边比较, 直接从有序的后面开始
     *
     * @param value
     */
    public static void bubbleSort2(int[] value) {
        for (int i = 0; i < value.length - 1; i++) {
            int j = i + 1;
            while (value[i] <= value[j]) {
                i++;
                j++;
            }
            for (; j < value.length; j++) {
                if (value[i] > value[j]) {
                    value[i] = value[i] ^ value[j];
                    value[j] = value[i] ^ value[j];
                    value[i] = value[i] ^ value[j];
                }
            }
        }
    }

插入排序

  • 插入排序, , 最好情况时间复杂度O(n), 最坏情况时间复杂度O(n2), 平均情况时间复杂度O(n2)
  • 插入排序是稳定的排序算法
  • 插入排序是原地排序算法(空间复杂度O(1))
    /**
     * 插入排序
     *
     * @param value
     */
    public static void insertionSort(int[] value) {
        for (int i = 1; i < value.length; i++) {
            int tem = value[i];
            for (int j = i; j > 0; j--) {
                if (tem < value[j - 1]) {
                    value[j] = value[j - 1];
                }else{
                    value[j] = tem;
                    break;
                }
            }
        }
    }

选择排序

  • 选择排序, 最好情况, 最坏情况, 平均情况时间复杂度都是O(n2)
  • 选择排序不是稳定的排序算法
  • 选择排序是原地排序算法(空间复杂度O(1))
    /**
     * 选择排序
     * @param value
     */
    public static void selectionSort(int[] value){
        for (int i = 0; i < value.length - 1; i++) {
            int min = i;
            for (int j = i + 1; j < value.length; j++) {
                if(value[j] < value[min]){
                    min = j;
                }
            }
            if(min != i){
                value[i] = value[i] ^ value[min];
                value[min] = value[i] ^ value[min];
                value[i] = value[i] ^ value[min];
            }
        }
    }
举报

相关推荐

0 条评论