zoukankan      html  css  js  c++  java
  • 冒泡排序

    经典排序算法 - 冒泡排序Bubble sort

    原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,

    这样一趟过去后,最大或最小的数字被交换到了最后一位,

    然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子

    例子为从小到大排序,

    原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |

    第一趟排序(外循环)

    第一次两两比较6 > 2交换(内循环)

    交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |

    交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |

    第二次两两比较,6 > 4交换

    交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |

    交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |

    第三次两两比较,6 > 1交换

    交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |

    交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |

    第四次两两比较,6 > 5交换

    交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |

    交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

    第五次两两比较,6 < 9不交换

    交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

    交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

    第二趟排序(外循环)

    第一次两两比较2 < 4不交换

    交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

    交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

    第二次两两比较,4 > 1交换

    交换前状态| 2 | 4 | 1 | 5 | 6 | 9 | 
    交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

    第三次两两比较,4 < 5不交换

    交换前状态| 2 | 1 | 4 | 5 | 6 | 9 | 
    交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

    第四次两两比较,5 < 6不交换

    交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |

    交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

    第三趟排序(外循环)

    第一次两两比较2 > 1交换

    交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

    交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

    第二次两两比较,2 < 4不交换

    交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 
    交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

    第三次两两比较,4 < 5不交换

    交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 
    交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

    第四趟排序(外循环)无交换

    第五趟排序(外循环)无交换

    排序完毕,输出最终结果1 2 4 5 6 9

    public class BubbleSort{
    public static void main(String[] args){
    int score[] = {67, 69, 75, 87, 89, 90, 99, 100};
    for (int i = 0; i < score.length -1; i++){ //最多做n-1趟排序
    for(int j = 0 ;j < score.length - i - 1; j++){ //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)
    if(score[j] > score[j + 1]){ //把小的值交换到后面
    int temp = score[j];
    score[j] = score[j + 1];
    score[j + 1] = temp;
    }
    }
    System.out.print("第" + (i + 1) + "次排序结果:");
    for(int a = 0; a < score.length; a++){
    System.out.print(score[a] + " ");
    }
    System.out.println("");
    }
    System.out.print("最终排序结果:");
    for(int a = 0; a < score.length; a++){
    System.out.print(score[a] + " ");
    }
    }
    }

    运行的结果为:

    第1次排序结果:67 69 75 87 89 90 99 100
    第2次排序结果:67 69 75 87 89 90 99 100
    第3次排序结果:67 69 75 87 89 90 99 100
    第4次排序结果:67 69 75 87 89 90 99 100
    第5次排序结果:67 69 75 87 89 90 99 100
    第6次排序结果:67 69 75 87 89 90 99 100
    第7次排序结果:67 69 75 87 89 90 99 100
    最终排序结果:67 69 75 87 89 90 99 100

    如果想输出100 99 90 89 87 75 69 67只需判断条件if(score[j] <score[j + 1])

     int temp = score[j];
    score[j] = score[j + 1];
    score[j + 1] = temp;

    上面三行只是交换前后两个元素的位置,变化成

    int temp = score[j + 1];
    score[j + 1] = score[j ];
    score[j] = temp

    对结果完全没有影响

    只是if语句若score[j] <score[j + 1]然后交换,就是后面大换到前面来得到的就是100 99 90 89 87 75 69 67这种从左到右依次递减序列

    反之结果亦反之

  • 相关阅读:
    keras使用AutoEncoder对mnist数据降维
    maven插件生成可执行jar包
    python基于opencv实现人脸定位
    使用Jieba提取文章的关键词
    汉语词性对照表
    SQL优化
    keras基于卷积网络手写数字识别
    统计学习
    log4j和slf4j的区别
    log4j配置详解(非常详细)
  • 原文地址:https://www.cnblogs.com/thomasbc/p/6646496.html
Copyright © 2011-2022 走看看