作者认为,一篇文章就应该和函数一样,多一分不多,少一分不少,所以我将用最短的字数,在最快的时间里帮你了解或者巩固传说中的冒泡排序。
--------------------------------------------华丽的分割线------------------------------------------------------------------
int[] arr = {1, 7, 4, 6, 9, 3, 8, 2, 5, 10}; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
如果是寻找代码怎么写的小伙伴,可以直接看这个!做一名cv程序猿,但我肯定知道,小伙伴们肯定希望自己学的更多,把自己锻造成一把锋利的宝剑!所以让我来抽丝剥茧,逐层演绎为什么可以。
----------------------------------------------------伟大的分割线---------------------------------------------------------
就跟谈恋爱一样,你总要知道对方的优点和确定,这样才会考虑要不要用它,不用急,我来给
你介绍这个对象!
冒泡排序:
找到最大值放在数组的最右边,之后数组左边的数组成的数列重新找到最大值,放到最右边。这样持续下去,直到数组按照从小到大排列。
优点:代码简单,稳定。空间复杂度较低。
缺点:慢。
------------------------------------------------------华丽的分割线---------------------------------------------------------
接下来让我来讲解为什么这样可以。
首先先看这样的数组
我们按照定义所描述的,找到最大值,将其放到数组的最右边,很明显,可以遍历数组,用交换法,将左边的最大值运到最右边。
int[] arr = {1, 7, 4, 6, 9, 3, 8, 2, 5, 10}; for (int i = 0; i < arr.length-1; i++) { if(arr[i] > arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } }
由于这里最大值已经是10,最大值的位置没有改变,,而第二大的9,放在了10的左边。数组长这个样子。
我们将arr的长度减少一,将剩下的数据继续这样操作
int[] arr = {1, 7, 4, 6, 9, 3, 8, 2, 5, 10}; for (int i = 0; i < arr.length-1; i++) { if(arr[i] > arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } for (int i = 0; i < arr.length-1-1; i++) { if(arr[i] > arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } }
由于这里最大值已经是9,最大值的位置没有改变,,而第二大的8,放在了9的左边。数组长这个样子。
以此类推,当我们将arr.length一直减去,最后终会将数组从小到大排序。确实是这样!
但是我们不能一次次这样写啊,所以可以用两个for循坏,来减少代码量!
那么循坏多少次呢?找规律,发现应该是 arr.length-1次。
所以我们将上面这种代码循坏arr.length-1次,而内部循坏体里面的i用j代替,循坏的次数也应该是剩余数组的长度,可以定义j=i+1.因为每次里面循坏一次,i就-1,然后下一次里面的循坏次数也会-1,巧妙的利用!
也就是这样:
int[] arr = {1, 7, 4, 6, 9, 3, 8, 2, 5, 10}; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
运行,观看结果。
果然和我们想的一样。
--------------------------------------------------------优雅的分割线-------------------------------------------------------
这样一来,我们就学会了冒泡排序!为自己鼓掌吧!如果读者得到了帮助,希望各位看官点个关
注,那就更好了哦