借助上面的图,首先理解一下何为冒泡排序:
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,依次比较两个元素,如果他们的顺序拥误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢浮到数列的顶端。
var arr=[5,4,3,2,1]
第一步:
我们用上面这个数组举例子:
首先,我们可以观察得知,这个5个数组元素,要想排序,需要走的趟数应该是4次,那么,外层循环的次数就应该是 arr.length-1
第二步:
外层循环每走一趟,里层循环计算外层循环走一趟里面的交换次数,我们用里层for循环
观察得知
第一趟,里层循环交换4次
第二遍,里层循环交换3次
第三趟,里层循环交换2次
第四趟,里层循环交换1次
长度就是数组长度减去次数
但是我们次数(循环里面的初始化变量 i)是从0次开始的所以最终 arr.length-i-1
#arr.length-i-1 这个是观察得知的, 你信吗!
举个例子吧:
第一趟,里层循环交换4次
第二遍,里层循环交换3次
第三趟,里层循环交换2次
第四趟,里层循环交换1次
你就发现一个规律: 4,3,2,1;
那么这个数组的列表长度是5,所以就可以 arr.length - i(i 是从0开始的) 结果是 5,4,3,2,1,也就是下面内层循环依次执行 5,4,3,2,1次
所以通过观察,就可以得知 arr.length-i-1; 就可以是 4,3,2,1 ,0次,
第三步:
交换2个变量就好了
<script> var arr = [4, 5, 3, 2, 1] for (var i = 0; i <= arr.length - 1; i++) { //外部循环计算循环趟数 for (var j = 0; j <= arr.length - i - 1; j++) { //里面循环负责每一趟的交换次数 // 内部交换2个变量的值,前一个和后面一个数组元素相比较 if (arr[j] > arr[j + 1]) { var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp } } } console.log(arr); </script>
最后再附上一个python的冒泡排序
arr = [4, 5, 3, 2, 1] for i in range(len(arr) - 1): # 外层循环走4趟 # print(i) # 0,1,2,3 print(len(arr) - i - 1) # 4,3,2,1 for j in range(len(arr) - i - 1): # 内层循环交换的次数 if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] print(arr)