实现冒泡排序 救救孩子

 

代码如下:

public static void main(String[] args){
	//完善数组
	int [] array={497,131,486}; //自己补全
	//冒泡排序
	for(int i =0; i < array.length -1; i++){
		for(int j = 0; j < array.length -i-1;j++){
			if(array[j] < array[j+1]){
				int temp = array[j];
				array[j] = array[j+1];
				array[j+1] = temp;
			}
		}
	}
	//输出数组
	for (int i = 0; i< array.length;i++){
		System.out.println(array[i]);
	}
}

 

说明:顾名思义冒泡排序就跟鱼吐泡泡一样 可以从小到大 、也可以从大到小

举例:var arr = [23, 54, 6, 444, 5, 2, 8]

代码:需求每次冒出一个最大的

第一次 冒
23, 54, 6, 444, 5, 2, 8  第一个 和 第二个 比 不变
23, 54, 6, 444, 5, 2, 8  第二个 和 第三个 比 变
23, 6, 54, 444, 5, 2, 8  第三个 和 第四个 比 不变
23, 6, 54, 444, 5, 2, 8  第五个 和 第五个 比 变
23, 6, 54, 5, 444, 2, 8  第五个 和 第六个 比 变
23, 6, 54, 5, 2, 444, 8  第六个 和 第七个 比 变
23, 6, 54, 5, 2, 8, 444  结束
​
​
第二次 冒
23, 6, 54, 5, 2, 8, 444  第一个 和 第二个 比
...

分析代码:有瑕疵冗余

<script>
// 第一次 冒
// 23, 54, 6, 444, 5, 2, 8  第一个 和 第二个 比 不变
// 23, 54, 6, 444, 5, 2, 8  第二个 和 第三个 比 变
// 23, 6, 54, 444, 5, 2, 8  第三个 和 第四个 比 不变
// 23, 6, 54, 444, 5, 2, 8  第五个 和 第五个 比 变
// 23, 6, 54, 5, 444, 2, 8  第五个 和 第六个 比 变
// 23, 6, 54, 5, 2, 444, 8  第六个 和 第七个 比 变
// 23, 6, 54, 5, 2, 8, 444  结束
​
// 需求:冒出一个最大的值
// 思路
// 1. 挨个输出所有值 arr[i]
// 2. 当前值arr[i] 和 下一个值比较arr[i+1]
// 3. 如果大于就交换位置
​
var arr = [23, 54, 6, 444, 5, 2, 8]
​
// 第一次 冒出一个最大的好没好
// for (var i=0; i<arr.length; i++) {
for (var i=0; i<arr.length - 1; i++) { // 3个人比2 4个人比3次
    // console.log(arr[i])
    // 判断
    /* 
        i=0   arr[0] 23 > arr[1] 54  不换  【 23, 54, 6, 444, 5, 2, 8 】
        i=1   arr[1] 54 > arr[2] 6     换  【 23, 6, 54, 444, 5, 2, 8 】
        i=2   arr[2] 54 > arr[3] 444 不换  【 23, 6, 54, 444, 5, 2, 8 】
        i=3   arr[3] 444 > arr[4] 5    换  【 23, 6, 54, 5, 444, 2, 8 】
        i=4   arr[4] 444 > arr[5] 2    换  【 23, 6, 54, 5, 2, 444, 8 】
        i=5   arr[5] 444 > arr[6] 8    换  【 23, 6, 54, 5, 2, 8, 444 】 
        i=6  是否需要走?  不需要  因为已经冒出一个最大的
        // 思考:上面for循环判断是否可以优化?
        // 分析:总共几个数7个 
        // 思考:3个比出一个最大的 比2次   4个人比出一个最大的3次
        // 因此:7个数 只要循环比6次 
        // 结果:上面长度得-1  最后一个不用比  这哥们就是最大的
    */
    if (arr[i] > arr[i+1]) {
        var temp = arr[i]
        arr[i] = arr[i+1]
        arr[i+1] = temp
    }
}
​
console.log(arr)   // [23, 6, 54, 5, 2, 8, 444]
​
// 第二次 冒出一个最大的 54
// 1. 输出所有数
// 2. 当前和 和 下一个比
// 3. 大于就换位置
​
// 思考:-1 还是 -2 
// 分析:上面-1是因为 3个人比2 4个人比3次
// 然后 再减去1  
// 因为:因为冒出一个最大的 -1
for (var i = 0; i<arr.length -2; i++) {
​
    if(arr[i] > arr[i+1]) {
        var temp = arr[i]
        arr[i] = arr[i+1]
        arr[i+1] = temp
    }
}
 
console.log(arr)  // [6, 23, 5, 2, 8, 54, 444]
​
​
// 第三次 冒 23 
​
// for (var i=0; i<arr.length; i++) {  // 思考是否需要优化?  肯定的
    
    // 分析:3个人 比 2次, 4个人比3次
    // 继续:arr.length 有7个数  比出一个最大的只要 arr.length - 1  6次
    // 思考:7个数里面我们已经确定几个数字最大了?
    // 回答:2个  因此还得  -2
    // 结果:-3
for (var i=0; i<arr.length -3; i++) 
{ 
    if(arr[i] > arr[i+1]) {
        var temp = arr[i]
        arr[i] = arr[i+1]
        arr[i+1] = temp
    }
}
console.log(arr)
​
// 第四次
for (var i=0; i<arr.length -4; i++) 
{ 
    if(arr[i] > arr[i+1]) {
        var temp = arr[i]
        arr[i] = arr[i+1]
        arr[i+1] = temp
    }
}
console.log(arr)
​
// 第五次
for (var i=0; i<arr.length -5; i++) 
{ 
    if(arr[i] > arr[i+1]) {
        var temp = arr[i]
        arr[i] = arr[i+1]
        arr[i+1] = temp
    }
}
console.log(arr)
​
// 第六次
for (var i=0; i<arr.length -6; i++) 
{ 
    if(arr[i] > arr[i+1]) {
        var temp = arr[i]
        arr[i] = arr[i+1]
        arr[i+1] = temp
    }
}
console.log(arr)
</script>

优化:搞公式

<script>
var arr = [23, 54, 6, 444, 5, 2, 8]
​
// 思想
// 外层控制次数
// 内存进行挨个输出对比交换
​
// 写代码
// 1. 先通过循环实现冒出一个最大的
// 2. 嵌套循环 外层 控制次数 即可
​
​
// 1. 先通过循环实现冒出一个最大的
// for (var i = 0; i < arr.length; i++) { // 优化:少比一次 2个人1次 3个人2次
// for (var i = 0; i < arr.length -1; i++) { 
//     // i        是每个值的下标
//     // arr[i]  每个值
//     // 当前值 和 下一个值 比较
//     // 大于 换
//     if (arr[i] > arr[i+1])
//     {
//         var temp = arr[i]
//         arr[i] = arr[i+1]
//         arr[i+1] = temp
//     }
// }
// console.log(arr)
​
// 2. 嵌套循环 外层 控制次数 即可
​
for (var j=1; j<arr.length; j++) {
    // j 123456
​
    // 分析:
    // 第一次 -1  因为 2个人比3次  3个人比2次
    // 第二次 -2  因为第一次已经确定一个最大的 后面不用管  -2
    // ..
    // for (var i = 0; i < arr.length -1; i++) { 
    for (var i = 0; i < arr.length -j; i++) { 
        // i        是每个值的下标
        // arr[i]  每个值
        // 当前值 和 下一个值 比较
        // 大于 换
        if (arr[i] > arr[i+1])
        {
            var temp = arr[i]
            arr[i] = arr[i+1]
            arr[i+1] = temp
        }
    }
}
​
console.log(arr)
​
</script>