1.排序算法
1.1 冒泡排序
思想:就是先将数组中一个最大(最小)的数找出来,使其处在数组的末尾(开端),然后将次大(小)的数再找出来,反复操作直至全部数组排序
原理(以找出大数举例):
a、将数组中第一个数和下一个数比较大小,第一个数小则位置不动,否则同第二个数交换位置
b、将新得到的第二个数继续和第三个数比较,重复第一步操作,直至倒数第二个数与数组最末尾的数比较了大小,这样就会得到一个最大的数在末尾,即是冒泡
c、忽略排好的数字,对原数组中剩下的数继续上述操作,直到所有数都排完
举个例子:
*2*,7,4,1=>
2,*7*,4,1=>
2,4,*7*,1=>
2,4,1,*7* // 这样就找到了最大数
*2*,4,1,7
2,*4*,1,7
2,1,*4*,7 // 这样就找到了次大数
*2*,1,4,7
1,*2*,4,7 // 次次大数(已经有序)
*1*,2,4,7 // 排序成功
拓展:
空间复杂度(执行上述程序所需要的计算机内存,即执行所需要的计算机临时空间或者说辅助内存,这里指数组交换产生的临时变量)
好的情况:0 // 原数组本身就排好了的
差的情况:O(N) // 原数组是逆序的
平均下来就是:O(1)
时间复杂度(执行上述程序计算机花销的时间)
好的情况:O(N)
差的情况:O(N^2)
平均下来就是(取最高阶):O(N^2)
JS实现代码:
function bubleSort(arr) {
for(let i = 0; i < arr.length ; i++) { /*i代表轮数*/
for(let j = 0; j < arr.length - i ; j++) { /*j代表当前轮选中的元素下标*/
if(arr[j] > arr[j+1]) {
[ arr[j], arr[j+1] ] = [ arr[j+1], arr[j] ] /*交换元素*/
}
}
}
}
var arr = [2, 1, 4, 7]
bubleSort(arr)
console.log(arr)