冒泡排序与查重【案列分析】

本文通过一个案例详细介绍了如何生成一个长度为10的随机升序无重复数组。首先,通过循环生成随机数组,接着使用冒泡排序算法进行升序排列,接着介绍如何利用新数组去重,最后在数组长度不足10时,补充随机数以满足长度要求。文章还阐述了冒泡排序中数字交换的正确方法和去重的简单策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现有一个长度为10的数组,数组中的每个元素为0-1000的随机数字,现请将此数组按升序排列并打印在页面上,且不能有重复数字。

题目分析:
查看题目,我们发现题目有如下几个个要求:

  • 获取随机数组
  • 将数组升序排列
  • 将数组去重

但是还有一个隐藏要求。因为进行去重操作后,数组的长度有可能会减少。由于题目要求输出长度为10的数组。所以我们要在最后进行最后一步操作:

  • 将数组补位

步骤分析:

  1. 获取随机数组
    获取一个空数组arr,并建立一个for循环,循环执行10次,每执行一次生成一个0-1000的一个随机数并赋值给arr,并用concat();方法拼接十次,生成一个新数组。最后将其封装成一个函数。

    				var arr = []; 			
    				function getRandomNumber(){
    				for(var i = arr.length,num; i < 10; i++){
    					num = Math.floor(Math.random()*1001);
    					var arr2 = [num];
    					arr = arr.concat(arr2);
    				}
    				return arr; 			} 			// console.log(getArr);  //查看获取的随机数数组
    
  2. 将数组升序排列
    排序的方法有很多,常用的有冒泡排序,快速排序,插入排序等等。这里我们选择比较简单的冒泡排序。 冒泡排序的算法也很简单,首先我们先建立一个两层循环,外循环和内循环执行的都是第一个数和第二数比较,第二个数与第三个数比较……虽然他们执行的过程都相同,但是嵌套在一起就很有意思了:
    外循环先获取第一个数字,然后进入内循环,内循环将这个数字和第二数比较,第三个数、第四个数……一直到最后一个数,然后内循环执行完毕,再回到外循环,获取第二个数字,然后在进入内循环,然后内循环将这个数字和剩下的数字依次比较……
    当外循环获取完第10个数时,循环结束
    内循环除了比较大小外,还要进行换位操作。因为我们要进行升序操作,当数字大于被比较的数字时,进行两个数的调换。
    两个数进行调换时,不能直接调换。例如:

    var a = 1; 
    var b =2; 
    a = b; 
    b = a;
    console.log(a,b);//输出结果都为2,并没有实现两个数互换。
    

    而正确的做法是应该是再建立一个空变量temp,然后将第一个数放到空变量中,第二个数传给第一个数的变量,然后再将temp存放的数传给第二个 数,这样就实现了两个数之间的交换。

    这就像两杯饮料,一杯雪碧,一杯可乐。没有第三个被子的帮助下,是不能完成雪碧和可乐互相调换。

    正确写法:

    var a = 1; 
    var b =2; 
    var temp = a; 
    a = b; 
    b = temp;
    console.log(a,b);//输出结果为2和1,实现两个数互换。
    
    			mySort(){
    				for(var x = 0;x < getArr.length;x++){
    					for(var y = x + 1; y < getArr.length;y++){
    						if(getArr[x]>getArr[y]){
    							var temp = getArr[x];
    							getArr[x] = getArr[y];
    							getArr[y] = temp;
    						}
    					}
    				}
    				return getArr; 			} 			// console.log(sort()); 
    
  3. 将数组去重
    去重的方法也有很多,这里我们也选用一个比较简便的方法。 先声明一个空数组,遍历排序后的数组,遍历出的每一个数与新数组的值比较,如果没有,即索引号(下标)的值为-1,则将该数字用push方法添加到新数组尾部,最终生成一个去重后的数组。

    //去重 			
    				var gotArr = mySort(); 			
    				function norepeat(){
    				var newArr = [];
    				for(var k = 0;k < gotArr.length;k++){
    					if(newArr.indexOf(gotArr[k]) === -1){
    						newArr.push(gotArr[k]);
    					}
    				}
    				return newArr; 			
    				}
    
  4. 将数组补位 我们可以这样理解,补位之前的数组长度有可能是小于10,如果小于10就进行补位,否则就不执行操作。 如果长度小于10,我们就再来一遍获取随机数,排序以及查重操作,重复这个步骤直到数组长度为10。

    //补位 			
    				var reNewArr = norepeat(); 			
    				function add(){
    				if(reNewArr.length < 10){
    					arr = reNewArr;
    					for(var a = 0;;a++){
    						getRandomNumber();
    						getArr = arr;
    						mySort();
    						gotArr = getArr;
    						arr = norepeat();
    						if(reNewArr.length == 10){
    							break;
    						}
    					}
    				}
    				return arr; 			}
    

完整代码:

//获取随机数数组
			var arr = [];
			function getRandomNumber(){
				for(var i = arr.length,num; i < 10; i++){
					num = Math.floor(Math.random()*1001);
					var arr2 = [num];
					arr = arr.concat(arr2);
				}
				return arr;
			}
			// console.log(getArr);
			//冒泡排序
			var getArr = getRandomNumber();
			function mySort(){
				for(var x = 0;x < getArr.length;x++){
					for(var y = x + 1; y < getArr.length;y++){
						if(getArr[x]>getArr[y]){
							var temp = getArr[x];
							getArr[x] = getArr[y];
							getArr[y] = temp;
						}
					}
				}
				return getArr;
			}
			// console.log(sort());
			//去重
			var gotArr = mySort();
			function norepeat(){
				var newArr = [];
				for(var k = 0;k < gotArr.length;k++){
					if(newArr.indexOf(gotArr[k]) === -1){
						newArr.push(gotArr[k]);
					}
				}
				return newArr;
			}
			//补位
			var reNewArr = norepeat();
			function add(){
				if(reNewArr.length < 10){
					arr = reNewArr;
					for(var a = 0;;a++){
						getRandomNumber();
						getArr = arr;
						mySort();
						gotArr = getArr;
						arr = norepeat();
						if(reNewArr.length == 10){
							break;
						}
					}
				}
				return arr;
			}
			document.write(add());//输出结果
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值