冒泡排序和选择排序

74 阅读2分钟

冒泡排序

相邻两个元素进行比较,将一个数组中的数字使用循环进行升序或降序的排列

冒泡排序:给数组中所有数字进行排序——————每相邻两个元素进行大小比较排列

var arr = [1,2,3]
2,1,3
2,3,1

3,2,1
3,2,1

交换数组中两个位置上的值

var arr = ['a','b','c']
var tmp = arr[0]
arr[0] = arr[1]
arr[1] = tmp
console.log(arr);
var arr = [1,2,3,4]
for(var a = 0; a< arr.length - 1; a++){
     if (arr[a] < arr[a+1]){
        var tmp = arr[a]
        arr[a] = arr[a+1]
        arr[a+1] = tmp
     
     }
     console.log(arr);
}
var arr = [1,2,3,4]
if (arr[0] < arr[1]){
    var tmp = arr[0]
    arr[0] = arr[1]
    arr[1] = tmp
}
  console.log(arr);//[2,1,3,4]
if (arr[1] < arr[2]){
    var tmp = arr[1]
    arr[1] = arr[2]
    arr[2] = tmp
}
  console.log(arr);//[2,3,1,4]

代码解析:

var arr = [3,2,1]; // ---> [1,2,3]
// 相邻的元素比较,就是下标i的元素跟下标i+1的元素比较 - 所以循环要比正常的遍历少一次
for(var i=0;i<arr.length-1;i++){
    // 如果前面的元素比后面的元素大
    if(arr[i]>arr[i+1]){
    	// 则交换位置
        var tmp = arr[i]
        arr[i] = arr[i+1]
		arr[i+1] = tmp
    }
}
// 这个循环结束后,arr变为:[2,1,3]
// 所以需要继续排列
for(var i=0;i<arr.length-1;i++){
    // 如果前面的元素比后面的元素大
    if(arr[i]>arr[i+1]){
    	// 则交换位置
        var tmp = arr[i]
        arr[i] = arr[i+1]
		arr[i+1] = tmp
    }
}
// 这个循环结束后,arr变为:[1,2,3]
// 两个循环代码是重复的,所以用循环处理。3个元素循环两次,4个元素循环3次,所以循环重复的次数也是数组长度-1
for(var j=0;j<arr.length-1;j++){
    for(var i=0;i<arr.length;i++){
        if(arr[i]>arr[i+1]){
        	var tmp = arr[i]
            arr[i] = arr[i+1]
            arr[i+1] = tmp
        }
    }
}
// 如果要降序排序,就将判断条件中的>改为<即可

选择排序

从大到小;从数组中找到最大值,排在第一位;从剩下的元素中找到最大值,排在第二位;从剩下的元素中找到最大值,排在第三位
var arr = [1,2,3,4]
4 1 2 3
4 3 1 2
4 3 2 1

从剩下的元素中找到最大值,排在第二位

for (var a = 2; a < arr.length; a++){
     if (arr[1] < arr [a]){
         var tmp = arr[1]
         arr[1] = arr[a]
         arr[a] = tmp
     }
}
//console.log(arr);

for (var a = 3; a < arr.length; a++){
     if (arr[2] < arr [a]){
         var tmp = arr[2]
         arr[2] = arr[a]
         arr[a] = tmp
     }
}
console.log(arr);

用循环处理重复

for (var b= 0; b < arr.length - 1; b++){
    for (var a = b + 1;a < arr.length; a++){
         if (arr[b] < arr [a]){
         var tmp = arr[b]
         arr[b] = arr[a]
         arr[a] = tmp
     }
   }   
}
console.log(arr);
var maxIndex = 0
for (var a = b + 1;a < arr.length; a++){
  if (arr[b] < arr [a]){
     maxIndex = a
  } 
}
console.log(arr);
var tmp = arr[0]
arr[0] = arr[maxIndex]
arr[maxIndex] = tmp
console.log(arr)
var maxIndex = 1
for(var a = 2; a < arr.length; a++){
  if (arr[1] < arr[a]){
    maxIndex = a
  }
}
console.log(maxIndex);
for (var b = 0;b < arr.length - 1;b++){
   var maxIndex = b
   for (var a = b+1;a < arr.length; a++){
       if(arr[b] < arr[b]){
          maxIndex = a
       }
   }
   // console.log(maxInddex);
   var tmp = arr[b]
   arr[b] = arr[maxInddex]
   arr[maxIndex] = tmp
}
console.log(arr);

降序:先找最大值,排在最左边,再找第二大的值,往左边靠...,已经排好的,不再参与比较

代码解析:

var arr = [3,2,1]; // ---》 [1,2,3]
// arr[0]放最小的值,所以将arr[0]跟后面所有值比较,如果有比arr[0]更小的,就跟arr[0]交换位置
for(var i=1;i<arr.length;i++){
    if(arr[0]>arr[i]){
    	var tmp = arr[0]
        arr[0] = arr[i]
        arr[i] = tmp
    }
}
// 此时的数组:[1,3,2]
// 第1个位置的数字排好了,排第2个位置上的数字
// arr[1]放剩下的数字中最小的,使用arr[1]跟后面的数字比较,如果有比arr[1]更小的,就跟arr[1]交换位置
for(var i=2;i<arr.length;i++){
    if(arr[1]>arr[i]){
    	var tmp = arr[1]
        arr[1] = arr[i]
        arr[i] = tmp
    }
}
// 此时的数组:[1,2,3]
// 重复代码用循环处理,3个数排2次,4个数排3次
for(var j=0;j<arr.length-1;j++){
    for(var i=j+1;i<arr.length;i++){
        if(arr[j]>arr[i]){
        	var tmp = arr[j]
            arr[j] = arr[i] 
            arr[i] = tmp
        }
    }
}
// 如果要进行降序排列,就将判断条件中的>换成<即可