关于冒泡排序

一直觉得没有完全理解冒泡排序,尤其是两两对比,一直感觉似懂非懂,于是重新梳理了一下,又换了很多种思路去是实现,最后居然发现按照自己思路写出来的和冒泡排序是一样的,这或许也是冒泡排序的另外一种理解方式

首先代码如下:

int[] arr = {11,9,8,5,6,5};
//这是一个用来交换的中介变量
int temp =0;
for (int i = 0; i < arr.length-1; i++) {
    for (int j = i+1; j < arr.length; j++) {
        if (arr[i]> arr[j]){
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}

我是这样理解的:冒泡排序是按照下标在数组中去找最适合的数字,比如是升序的话,就是要最小的数字在下标0的位置

那么在第一次外部循环中,就是这个样子(画得有点抽象T T):

 数组下标0的位置通过5次内部循环,不断找出数组中最小的的数,不断的比大小,交换值,在1,2,3,4,5中,不断把比11小的数字搬上去,就像打擂台一样,只要比位置里数字小的就拉上台,让小的获胜,把大的踢下台,经过5次比赛,最后让数字5放在0的位置上,这里由于有两个五,并不满足上台条件,所以第二个5的位置不会变经过一轮之后。5就在0的位置上了,然后第二次外部循环,开始找下标1的数字

因为位置0的数字已经确定是最小的,所以位置1的数字就需要往下面去找,位置2,3,4也是一样的道理。

最后就会找出位置0,1,2,3,4上最合适的位置,而位置5上的数字就不需要找了,因为已经没有数字能和它比较了,所以外部循环的次数需要-1,否则程序会硬往它后面找,然后它后面已经没数字了,然后就会报错。

最后的输出结果:[11, 9, 8, 6, 5, 5]

其中,有一点非常有意思,按照道理来说,位置0后面的位置在找数字时不需要往前找,如果要找应该会出现逻辑错误,不能输出想要的结果,但是如果硬要找呢?

将int j=0;让它的对比值包括它之前的数字和它自己

for (int i = 0; i < arr.length-1; i++) {
    for (int j = 0; j < arr.length; j++) {
        if (arr[i]> arr[j]){
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}

输出结果为:[11, 9, 8, 6, 5, 5]

似乎从升序变成了降序,那么往数组里面多加些数字试试呢?

输出结果为:[234, 234, 75, 11, 9, 8, 6, 6, 6, 5, 5, 5, 0, 75]

似乎只有最后一个数字不在顺序上,那么如果让最后一个数字也参与到竞争中来呢,毕竟它的比较值为整个数组,没有必须在它后面的要求,让外部循环增加一次也不会让数组越界。

for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr.length; j++) {
        if (arr[i]> arr[j]){
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}

输出结果为:[234, 234, 75, 75, 11, 9, 8, 6, 6, 6, 5, 5, 5, 0]

神奇的也完成了排序

这里根据调试,去理解了一下,可以这样说,只是改变了一点参数,方法逻辑就变化了,浅薄的说,这里的逻辑就是在外部循环中,将每个数字提出来通过内部循环遍历整个数组,放在它合适的位置上。

写完感觉自己的理解也深了不少,但总还是有没完全搞明白的感觉,掉头发.....

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值