JS冒泡排序和选择排序

JS冒泡排序和选择排序

一.冒泡排序

通过for循环,实现排序,每次循环,找到一个当前的最大值,多次循环,完成排序。

以下为冒泡排序的运行原理:
现在我们先定义一个数组 var a = [5,7,4,2,3,1,8,6,9,10];

var a = [5,7,4,2,3,1,8,6,9,10];;
console.log(a);

在这里插入图片描述
让数组继续一次以下循环

for (var i = 0; i <= a.length-1; i++){
	if (a[i] > a[i+1] ){ // 如果出现一个数大于他后面的一个数 
		var res = 0;     // 他就和他后面的数交换位置
		res = a[i];
		a[i] = a[i+1];
		a[i+1] = res;
	}
}
console.log(a);

在这里插入图片描述
就会发现进行一次该循环就会找出该数组的最大值放在最后,我们可以再进行一次循环观看效果
在这里插入图片描述
就会找出剩下的数值中最大的数放在他们的最后
所以一次循环我们找出一个最大的数,所以有多少个数我们就进行多少次循环,就能完成排序了
所以代码如下:

var a = [5,7,4,2,3,1,8,6,9,10,0];
console.log(a);
for (var j = 0; j <= a.length-1; j++){
	for (var i = 0; i <= a.length-1; i++){
		if (a[i] > a[i+1] ){ // 如果出现一个数大于他后面的一个数 
			var res = 0;     // 他就和他后面的数交换位置
			res = a[i];
			a[i] = a[i+1];
			a[i+1] = res;
		}
	}
}
console.log(a);

在这里插入图片描述
冒泡排序就完成了,以下为我们对代码进行的优化

var a = [5,7,4,2,3,1,8,6,9,10,0];
console.log(a);
for (var j = 0; j <= a.length-1 - 1; j++){
/* 
  我们一次循环找到一个最大值,
  当我们只剩下最后两个值时找到了最大值
  我们就不需要再继续一次循环了
  所以 j <= a.length-1; 可以改为 j <= a.length-1-1;
  同理 i <= a.length-1; 可以改为 i <= a.length-1-1;
*/
	for (var i = 0; i <= a.length-1-1-j; i++){
	// 又因为我们进行一次循环后就确定了一个最大值的位置
	// 然后我们再进行一次循环时 的循环的次数就可以少一次
	// 所以 i <= a.length-1-1; 可以改为 i <= a.length-1-1-j;
		if (a[i] > a[i+1] ){ 
			var res = 0;
			res = a[i];
			a[i] = a[i+1];
			a[i+1] = res;
		}
	}
}
console.log(a);

二.选择排序

从起始位置开始,找最小的数值所在的索引下标,如果最终存储的索引下标,不是起始位置,就与起始位置交换存储数据
以下为冒泡排序的运行原理:
我们还是用刚才的数组 var a = [5,7,4,2,3,1,8,6,9,10];
我们利用以下方法寻找最小数值的索引下标

for (var i = 0; i <= a.length-1; i++){
	if (a[min] > a[i]){//当 a[min] > a[i] 时我们就认为 a[i] 为最小值
		min = i;       //当整个数组循环完了后min 就等于 最小值 a[i] 的i
	}
}

在这里插入图片描述
我们找到了最小数值的索引小标发现他不是在首位,我们就需要把首位的数和他进行交换

if (min != 0){
    var res = 0;
	res = a[0];
	a[0] = a[min];
	a[min] = res;
}
console.log(a);

在这里插入图片描述
我们首位数找到了接下来我们就找第二位数

var min = 1; 
for (var i = 1; i <= a.length-1; i++){
	if (a[min] > a[i]){
		min = i;
	}
}
if (min != 1){
	var res = 0;
	res = a[1];
	a[1] = a[min];
	a[min] = res;
}
console.log(a);

在这里插入图片描述
我们这样依次找下去,找到最后一个数就完成,我们就写成一个循环这样选择排序就完成了

for (var j = 0; j <= a.length-1; j++){
	var min = j;
	for (var i = j; i <= a.length-1; i++){
		if (a[min] > a[i]){
			min = i;
		}
	}
	if (min != j){
		var res = 0;
		res = a[j];
		a[j] = a[min];
		a[min] = res;
	}
}
console.log(a);

在这里插入图片描述
选择排序就完成了,以下为我们对代码进行的优化

var a = [5,7,4,2,3,1,8,6,9,10,0];
console.log(a);
for (var j = 0; j <= a.length-1-1; j++){
	// 倒数第2个数的值都找到了最后一个数自然就确定了
	// 所以 j <= a.length-1; 可以改为 j <= a.length-1-1;
	var min = j;
	for (var i = j+1; i <= a.length-1; i++){
		// 因为 a[min] = a[j] 所以就可以从 j+1 开始
		// 所以 i = j; 可以改为 i = j+1;
		if (a[min] > a[i]){
			min = i;
		}
	}
	if (min != j){
		var res = 0;
		res = a[j];
		a[j] = a[min];
		a[min] = res;
	}
}
console.log(a);

以上就是在逆战班学习到关于冒泡排序和选择排序的原理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(눈ωಡ)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值