java冒泡排序选择排序快速排序(手撕)

冒泡排序的原理就是一共n个数 排n-1轮 每轮比较的数比上一轮少一个

每一轮把最大的数提到最后面(升序)比如第一轮把最大的数提到最后

第二轮把这轮一个一个比较出来得到的最大的数放到数组的倒数第二个位置上

public void popo(){
        for (int i=0;i<pos-1;i++){
            for (int j=0;j<pos-1-i;j++){
                if (arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
    }

选择排序 比冒泡排序效率要高一点 因为它不会一次次地更换位置 而是用一个变量来存储然后

一个一个比较 也是每次把最大的数提到数组最后面 一共n-1轮

public void option(){
        for (int i=0;i<pos-1;i++) {
            int max =i;
            for (int j = i+1; j < pos; j++) {
                if(arr[max]<arr[j]){
                    max = j;
                }
            }
            if(i!=max) {
                int temp = arr[i];
                arr[i] = arr[max];
                arr[max] = temp;
            }
        }
    }

快速排序 :

思路:这段代码和一般的快排思路还不一样 一般的是找一个基准 然后
左右指针开始移动 都是和这个基准比 比如要升序排序
那么左边指针就要找比基准大的放右边指针元素上 同理右边指针找比基准小的和左边指针元素互换
如果找不到指针就一直移动 找到了就互换 然后换另一个指针移动 循环往复
本段代码不一样的点在于它没有基准 省略了一些东西 就是left和right指针元素直接比
比如降序 就是找左指针比右指针小的 找到了就互换元素并换个指针移动
一样的道理 flag用来控制移动方向
一旦指针重合就一分为二 继续递归排序

这里还有个疑惑 为什么这里要用到递归呢?
因为每次都是两个值再比 只有不符合条件了 指针才会互换
不然指针就一直运动 直到重合 这样就忽略了指针移动过的这些元素的排序
而只比较了这两个元素的位置

public void quick(int low,int high){
        int lo=low;int hi=high;
        if(lo>=hi){
            return;
        }
        boolean flag=false;
        while(lo<hi){
            if(arr[lo]<arr[hi]){
                int temp = arr[lo];
                arr[lo]=arr[hi];
                arr[hi]=temp;
                flag=!flag;
            }
            if(flag){
                lo++;
            }else{
                hi--;
            }
        }
        lo--;hi++;
        quick(low,lo);
        quick(hi,high);
    }

冒泡和选择排序建议背下来 快排掌握原理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

后季暖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值