冒泡排序是什么
通过对待排序的序列从前向后依次比较相邻元素的值,如果发现逆序则交换。
逆序的含义:如果想把序列从小到大排序,那么两个数中前面的比后面的大就是逆序。
若需求是将序列从小到大排序,那么每一趟比较都会把值较大的逐渐从前面移动到后面。
这个数组显然是杂乱无章的,我们不管是要将它升序排列还是降序排列,其目的都是让它成为有序的数组。
let arr = [1,35,42,52,47,45,2,3,5,84,55,2,45]
定义两个变量 i 和 j,初始状态 i 存第一个元素的索引,j存i代表元素的下一个元素的索引;
//定义循环次数,之前比较出的数值,不参与下一次的比较
var arr = [13, 42, 55, 66, 12, 525, 456, 588, 688, 888, 3, 55]
//定义循环次数,之前比较出的数值,不参与下一次的比较
for (let j = 0; j <= (arr.length - 1) - 1; j++) {
//上一次比较出的数值,不参与下一次循环
for (var i = 0; i <= (arr.length - 1) - 1; i++) {
//内层循环,每次循环比较一个最大值,然后交换位置
if (arr[i] > arr[i + 1]) {
var middle = 0;
middle = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = middle;
}
}
}
console.log(arr);
冒泡排序的思想是:
没经过一轮比较我们都会确定一个值(把最大的或者最小的)进行比较1和35比较没有35大就不互换位置依次类推知道比较完从第二个下标35开始比较35没有42大不会互换位置直到比较到2的时候互换位置
总结
冒泡排序的思想是通过对待排序的序列从前向后依次比较相邻元素的值,如果发现逆序则交换。
优化方法是,若一趟排序中没有发生交换则退出循环,已经有序。
冒泡是从第一个开始和第二个比较,然后更具条件交换位置,然后再次两两相邻比较,
这时候,较大值就会逐渐出现在数组的尾部,当然如果是反序排列就是较小值在尾部
递归
简单讲就是函数调用自己。
简单来说,循环是有去无回,而递归则是有去有回(因为存在终止条件)。
优点:
递归的优点就是简洁、易于理解。
缺点:
递归通常会出现许多重复计算,导致时间复杂度高。
调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。
在调用自己前的代码是先进先出;
忽略调用自己的代码;
在调用自己后的代码是后进先出;