冒泡排序

  1. 冒泡排序的思想:
    1. 从头开始,比较相邻的两个元素,若第一个比第二个大,则交换他们
    2. 一轮比较结束了之后
    3. 重新从头开始再次循环一遍

冒泡排序的实现

  1. function bubbleSort(nums) {
  2. // 临时变量用来临时保存两个值交换过程中的一个值
  3. let temp;
  4. // 外层比较次数为元素个数
  5. for (let i = 0; i < nums.length; i++) {
  6. // 比较的次数为元素数量 - 1
  7. for (let j = 0; j < nums.length - 1; j++) {
  8. if (nums[j] > nums[j + 1]) {
  9. temp = nums[j + 1];
  10. nums[j + 1] = nums[j];
  11. nums[j] = temp;
  12. }
  13. }
  14. }
  15. return nums;
  16. }
  17. // let arr = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
  18. // console.log(bubbleSort(arr));
  19. function createArr(n) {
  20. let arr = [];
  21. for (let i = n; i > 0; i--) {
  22. arr.push(i);
  23. }
  24. return arr;
  25. }
  26. let arr = createArr(10000);
  27. console.log(bubbleSort(arr));

Snipaste_2022-05-08_20-07-55.png
比较过程
Snipaste_2022-05-08_20-10-34.png

冒泡算法的改进

如上图所示:虽然经过第一轮比较之后,5已经是数组中最大的元素且位置已经在最后面,但是之后的每一轮比较还是把5给加上了

  1. 改进策略:每一轮都相较上一轮减少一次无用的比较

Snipaste_2022-05-08_20-15-36.png

  1. function bubbleSort(nums) {
  2. let temp;
  3. for (let i = 0; i < nums.length; i++) {
  4. // 减少每次重复比较的次数
  5. for (let j = 0; j < nums.length - i - 1; j++) {
  6. if (nums[j] > nums[j + 1]) {
  7. temp = nums[j + 1];
  8. nums[j + 1] = nums[j];
  9. nums[j] = temp;
  10. }
  11. }
  12. }
  13. return nums;
  14. }

Snipaste_2022-05-08_20-16-23.png