Java—冒泡、插入排序(递归实现)

冒泡排序

public class BubblingSort {
    public static void main(String[] args) {
        int[] a = {3, 2, 6, 1, 5, 4, 7};
        //最开始默认数组都是未排序的
        bubble(a, 0, a.length - 1);
        System.out.println(Arrays.toString(a));
    }
    //low 与 high 为未排序范围
    public static void bubble(int[] a,int low,int high){
        //递归结束条件就是未排序范围为1时
        if(low == high){
            return;
        }
        int j = low;
        //只用排序未排序部分
        for (int i = low; i < high; i++) {
            //如果i+1索引比i索引小就交换两个值
            if(a[i] > a[i+1]){
                int temp = a[i];
                a[i] = a[i+1];
                a[i+1] = temp;
                //记录最后一次交换后的i位置就是为下一次未排序的最大范围
                j = i;
            }
        }
        //递归,low不变,还是0
        bubble(a,low,j);
    }
    /*j 表示的是未排序的边界,下一次递归时的 high
    发生交换,意味着有无序情况
    最后一次交换(以后没有无序)时,左侧 i 仍是无序,右侧 i+1 已然有序*/
}

插入排序 

public class Main {
    public static void main(String[] args) {

        int[] a = {3, 2, 6, 1, 5, 4, 7};

        //一开始将0索引的值为已经排序好的,所以从1索引开始插入
        insertSort(a,1);

        System.out.println(Arrays.toString(a));
    }

    //low为未排序的初始索引
    public static void insertSort(int[] a, int low){

        if(low == a.length){
            return;
        }

        //记录初始索引位置的元素值
        int t = a[low];
        //low-1之前索引都是排序好的
        //获取已排序索引的最后一个元素为后续跟未排序第一个元素作比较
        int i = low -1;

        //不断循环,直到找到比未排序第一个索引小的元素跳出循环
        //有一种特殊情况是t比前面的数都小,不断循环i最终会变为-1
        //所以需要加个条件,如果i<0也跳出循环
        while (i >= 0 && a[i] > t){
            a[i+1] = a[i];
            i--;
        }

        //循环结束就找到了插入位置
        //将初始索引位置的元素值赋值给比t小的下一个索引
        //a[i+1] = t;

        //此赋值有一个小优化的点就是未排序的元素值t刚好比该元素前一个已排序的值小
        //不会进入循环,i的值也不会变化
        //此时就不需要赋值a[i+1] = t了,可以继续递归了
        if(i + 1 != low){
            a[i+1] = t;
        }

        //继续排序low的下一个元素
        insertSort(a,low+1);
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值