一直觉得没有完全理解冒泡排序,尤其是两两对比,一直感觉似懂非懂,于是重新梳理了一下,又换了很多种思路去是实现,最后居然发现按照自己思路写出来的和冒泡排序是一样的,这或许也是冒泡排序的另外一种理解方式
首先代码如下:
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]
神奇的也完成了排序
这里根据调试,去理解了一下,可以这样说,只是改变了一点参数,方法逻辑就变化了,浅薄的说,这里的逻辑就是在外部循环中,将每个数字提出来通过内部循环遍历整个数组,放在它合适的位置上。
写完感觉自己的理解也深了不少,但总还是有没完全搞明白的感觉,掉头发.....