关于冒泡排序以及递归的理解

关于冒泡排序以及递归的理解

就是将数组的数据循环并排序,重新组成新的数组,就是冒泡排序
例如:

//这里我们先定义一个随机数组
var arr = [10000, 5888, 12000, 6999, 7000, 3000, 4500, 1200, 6000]

//首先循环数组,来遍历每一项的值
for(var i=0; i<arr.length; i++){
	//再次遍历来判断前后两次的值
	for(var j=0; j<arr.length; j++){
		//当后面一个的值比前面值大时,两个值交换
	    if(arr[j+1]>arr[j]){
	    	//相当于最简单的a,b值互换
	    	// let a=4,b=5,c; c=a; b=a; a=c;
        	let flag= arr[j]
	        arr[j]=arr[j+1];
            arr[j+1]=flag
        }
	}
}
console.log(arr);
//最后会得到
//(9) [12000, 10000, 7000, 6999, 6000, 5888, 4500, 3000, 1200]

使用双循环来进行排序,外部循环控制所有的回合,
内部循环代表每一轮的冒泡处理,进行变量的比较与交换。

下面我们就来写一个例子来练习冒泡排序:

例题:下面数组每次会从最大的值依次消除到最小,请问需要循环几遍来全部消除
var arr = [10000, 5888, 12000, 6999, 7000, 3000, 4500, 1200, 6000]

//按照题目可以得出第一次是 10000,5888,3000,1200
// 第二次是12000,6999,4500
// 第三次是7000,6000,就需要3次循环

for(var i=0; i<arr.length; i++){
	let num= arr[i];        //保存的数组每一项
    // console.log(num);       
	for(var j=0; j<arr.length; j++){
		//判断当数组上一个值大于下一个值时,将下一个的值替换并删除
 		if(num > arr[j]){
			num = arr[j]
            arr.splice(j,1)
            // console.log(num);
        }
     }
     // console.log(num);
}
//最后得出的就是最前面的最大值
console.log(arr.length);

对冒泡排序的优化

function fn(data) {
	let flag = true // 用来判断数据是否排列完
	let swap
	while(flag) {
		flag = false
		for(var j = 1; j<data.length; j++) {
			if(data[j - 1] > data[j]){
				swap = data[j - 1]
				data[j - 1] = data[j]
				data[j] = swap
				flag = true
			}
		}
		n--
	}
	return data
}
fn(arr)

递归函数的使用

递归就是函数的自我调用,就是在函数中调用自己。
首先要有判断结束的条件,还有没有满足条件的调用
例如:最简单的1到100值的相加

let i=0;
function fn(num){
	//判断num形参的值,如果等于1,就return
	if(num==1){
    	return num
    }
    //如果不等于1,就让值加函数调用100-1,以此类推。
    return num+fn(num-1)
}
console.log(fn(100));	//将100作为实参传进去
//打印出来就是1到100相加的结果

递归函数特点:

  1. 每次调用都会有一次返回
  2. 递归函数中必须有终止语句。
  3. 每一级函数调用时都有自己的变量

递归会消耗大量内存,在实际开发中很少使用
小例子:

 const arr = [
	{
    	id: 1,
        title: "课程1",
        children: [
        	{id: 4,title: "课程1-1"},
            {
            	id: 5,
                title: "课程1-2",
                children: [
                	{ id: 6, title: "课程1-2-1" },
                    { id: 7, title: "课程1-2-2" },],
                },
    	],
	},
    { id: 2, title: "课程2" },
	{ id: 3, title: "课程3" },
];
将上面的json数据递归平铺到数组里面

let list=[];
function fn(arr){
	arr.forEach(item => {
    	if(item.children){
        	fn(item.children)
        }
        list.push(item)
        list.forEach(item=>{
        	delete item.children
        })
	});
}
fn(arr)
console.log(list);
//打印结果 [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
// 0: {id: 4, title: "课程1-1"}
// 1: {id: 6, title: "课程1-2-1"}
// 2: {id: 7, title: "课程1-2-2"}
// 3: {id: 5, title: "课程1-2"}
// 4: {id: 1, title: "课程1"}
// 5: {id: 2, title: "课程2"}
// 6: {id: 3, title: "课程3"}
// length: 7
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值