JAVA 基础算法-排序 冒泡排序 选择排序 插入排序 快速排序 kaki的博客

5 篇文章 0 订阅

冒泡排序
口诀:两两替换,逐一比较

  //冒泡排序  逐一比较(第一个与第二个比较,第二个与第三个比较),两两替换
    public static void bubbo(int [] arr){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length-1; j++) {
                if(arr[i]<arr[j]){
                    int temp =  arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

选择排序
口诀:交换最小索引

   //选择排序  记录最小数据的索引并替换 交换索引
    public static void select(int [] arr){
        for (int i = 0; i < arr.length -1; i++) {
            int minIndex = i;
            for (int j = minIndex+1; j < arr.length; j++) {
                if(arr[minIndex]>arr[j]){
                    int tmep = arr[minIndex];
                    arr[minIndex]= arr[j] ;
                    arr[j] = tmep;
                }
            }
        }
    }

插入排序
口诀:与前一个比较,成立则代替,否则为最终

    //插入排序  记录一个数据值,依次比较其前面的值,如果大于它就放在后边,如果小于它位置不变
    public static void insert(int [] arr){
        int temp = 0;
        for (int i = 1; i < arr.length; i++) {
            temp = arr[i];
            int j = i-1;
            while (j>=0){
                if(arr[j]>temp){
                    //如果前一个数字大于当前数字,就取代当前数字位置
                    arr[j+1] = arr[j];
                }else {
                    break;
                }
                j--;
            }
            //直到前边的数字不大于当前数字,那该数字就是当前数字位置加1处
            arr[j+1] = temp;
        }
    }

经典递归案例

   //经典递归(累加)
    public int recursion(int sum){
        if (sum<1){
            throw new RuntimeException("sum > 1 才行");
        }

        if(sum== 1){
            return 1;
        }else {
            return sum + recursion(sum-1);
        }

    }

快速排序

 //快速排序
    public static void quickSort(int[] datas,int start,int end){
        if (start >= end) {//判断是否交叉
            return;
        } else {
            //中间位置
            int middle = findMiddle(datas,start,end);
            //数据分成2半
            quickSort(datas, start, middle -1);
            quickSort(datas, middle + 1, end);
        }
    }

    private static int findMiddle(int[] datas,int start,int end){
        //参照物
        int temp = datas[end];
        int left = start;//左下标
        int right = end - 1;//右下标

        //循环判断找位置
        while (true) {
            // 从左边找第一个比参照大的值
            while (left < end && datas[left] <= temp) left++;

            if (left == end) {
                //参照物是最大的
                break;
            }


            //从右边找第一个比惨照物小的值
            while (right >= start && datas[right] >= temp) right--;



            //判断是否交叉
            if (left < right) {
                //否:交换左右下标的值,继续
                change(datas, left, right);
                continue;
            } else {

                //有: 交换左下标和参照物的值,结束,左下标把数据分成2半,结束循环
                change(datas,left,end);
                break;
            }
        }



        return left;
    }

    private static void change(int datas[], int from, int to) {
        int temp = datas[from];
        datas[from] = datas[to];
        datas[to] = temp;
    }

欢迎点赞关注收藏哦 ,码云搜索KakiNakajima

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KakiNakajima

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值