lcg_magic算法笔记:冒泡排序

Love The Way You Lie 2021-09-24 22:30 384阅读 0赞

文章目录

  • 冒泡排序
      1. 思想
      1. 算法
      1. 代码
      1. 结果
      1. 疑问
      1. 改进
      1. 更新
      1. 比较
      1. 源码
      1. 文件

冒泡排序

1. 思想

冒泡排序,人如其名,排序过程就是一个不断冒泡的过程。
在冒泡过程中,值较大的元素下沉,值较小的元素上浮,逐渐形成有序。


若序列 A A A 中有 n n n 个元素,通常需要进行 n − 1 n-1 n−1 轮。
第 1 轮,针对 A [ 1 ] A[1] A[1] 至 A [ n ] A[n] A[n] 元素进行排序;
第 2 轮,针对 A [ 1 ] A[1] A[1] 至 A [ n − 1 ] A[n-1] A[n−1] 元素进行排序;
……;
第 n − 1 n-1 n−1 轮,针对 A [ 1 ] A[1] A[1] 至 A [ 2 ] A[2] A[2] 元素进行排序。

每一轮进行的过程:比较相邻的两个元素,如果不满足相对顺序,则进行交换;否则,不进行操作。
直到这一轮中所有的元素和相邻元素的相对顺序正确。

2. 算法

在这里插入图片描述

3. 代码

  1. public class BubbleSort
  2. {
  3. /** * 交换数组中的两个元素 * * @param array 一维数组 * @param firstIndex 待交换的第一个元素下标 * @param secondIndex 待交换的第二个元素下标 */
  4. public static void swap(int[] array, int firstIndex, int secondIndex)
  5. {
  6. int buffer = array[firstIndex];
  7. array[firstIndex] = array[secondIndex];
  8. array[secondIndex] = buffer;
  9. }
  10. /** * 冒泡排序 * * @param array 待排序的数组,也作为排序后的数组 */
  11. public static void bubbleSort(int[] array)
  12. {
  13. for (int i = 0; i < array.length - 1; ++i)
  14. {
  15. for (int j = 0; j < array.length - 1 - i; ++j)
  16. {
  17. if (array[j] > array[j + 1])
  18. {
  19. swap(array, j, j + 1);
  20. }
  21. }
  22. System.out.println("第 " + (i + 1) + " 轮:" + Arrays.toString(array));
  23. }
  24. }
  25. }

4. 结果

在这里插入图片描述

结论:数组中的元素按照非递减顺序存储,排序结果正确。

5. 疑问

观察输出结果可以发现:

第 6 轮排序的结果已经是最终的结果,第 7 ~ 9 轮排序无意义(浪费时间)。

是否可以改进上面的算法,使得在中间某一轮达到最终排序结果的时候,停止冒泡算法呢?
答案是:可以!

6. 改进

观察第 6 轮和第 7 轮冒泡排序,发现第 7 轮和第 6 轮排序后的结果完全一致。也即是说,第 7 轮冒泡排序没有交换任意两个元素。那么这一条件,可以作为冒泡排序算法的终止条件。

在这里插入图片描述

7. 更新

  1. public class BubbleSort
  2. {
  3. /** * 交换数组中的两个元素 * * @param array 一维数组 * @param firstIndex 待交换的第一个元素下标 * @param secondIndex 待交换的第二个元素下标 */
  4. public static void swap(int[] array, int firstIndex, int secondIndex)
  5. {
  6. int buffer = array[firstIndex];
  7. array[firstIndex] = array[secondIndex];
  8. array[secondIndex] = buffer;
  9. }
  10. /** * 冒泡排序改进版 * * @param array 待排序数组,也作为排序后的数组 */
  11. public static void bubbleSortAdvanced(int[] array)
  12. {
  13. boolean swapFlag = true;
  14. for (int i = 0; swapFlag && i < array.length - 1; ++i)
  15. {
  16. swapFlag = false;
  17. for (int j = 0; j < array.length - 1 - i; ++j)
  18. {
  19. if (array[j] > array[j + 1])
  20. {
  21. swap(array, j, j + 1);
  22. if (!swapFlag)
  23. {
  24. swapFlag = true;
  25. }
  26. }
  27. }
  28. System.out.println("第 " + (i + 1) + " 轮:" + Arrays.toString(array));
  29. }
  30. }
  31. }

结论:数组中的元素按照非递减顺序存储,排序结果正确。

8. 比较

在这里插入图片描述

9. 源码

  1. package louis;
  2. import java.util.Arrays;
  3. public class BubbleSort
  4. {
  5. /** * 交换数组中的两个元素 * * @param array 一维数组 * @param firstIndex 待交换的第一个元素下标 * @param secondIndex 待交换的第二个元素下标 */
  6. public static void swap(int[] array, int firstIndex, int secondIndex)
  7. {
  8. int buffer = array[firstIndex];
  9. array[firstIndex] = array[secondIndex];
  10. array[secondIndex] = buffer;
  11. }
  12. /** * 冒泡排序 * * @param array 待排序的数组,也作为排序后的数组 */
  13. public static void bubbleSort(int[] array)
  14. {
  15. for (int i = 0; i < array.length - 1; ++i)
  16. {
  17. for (int j = 0; j < array.length - 1 - i; ++j)
  18. {
  19. if (array[j] > array[j + 1])
  20. {
  21. swap(array, j, j + 1);
  22. }
  23. }
  24. System.out.println("第 " + (i + 1) + " 轮:" + Arrays.toString(array));
  25. }
  26. }
  27. /** * 冒泡排序改进版 * * @param array 待排序数组,也作为排序后的数组 */
  28. public static void bubbleSortAdvanced(int[] array)
  29. {
  30. boolean swapFlag = true;
  31. for (int i = 0; swapFlag && i < array.length - 1; ++i)
  32. {
  33. swapFlag = false;
  34. for (int j = 0; j < array.length - 1 - i; ++j)
  35. {
  36. if (array[j] > array[j + 1])
  37. {
  38. swap(array, j, j + 1);
  39. if (!swapFlag)
  40. {
  41. swapFlag = true;
  42. }
  43. }
  44. }
  45. System.out.println("第 " + (i + 1) + " 轮:" + Arrays.toString(array));
  46. }
  47. }
  48. /** * main 函数,进行测试。 * * @param args 系统输入的参数 */
  49. public static void main(String[] args)
  50. {
  51. int[] array = new int[]{ 43, 32, 76, -98, 0, 64, 33, -21, 32, 99};
  52. bubbleSort(array);
  53. System.out.println("Bubble Sort 最终结果:" + Arrays.toString(array));
  54. array = new int[]{ 43, 32, 76, -98, 0, 64, 33, -21, 32, 99};
  55. bubbleSortAdvanced(array);
  56. System.out.println("Bubble Sort Advanced 最终结果:" + Arrays.toString(array));
  57. }
  58. }

10. 文件

源代码文件已放至我的 Github 仓库中,如有需要请自行下载。
链接:Github(domagic):BubbleSort.

发表评论

表情:
评论列表 (有 0 条评论,384人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法——冒泡排序

    前言 冒泡排序基本思想:假设数据元素存放于数组L中,初始化时,有序区为空,无序区为0~n-1;在无序区中,每次均从头至尾一次比较相邻的两个元素j和j+1,若存在逆序,则交

    相关 排序算法-冒泡排序

    冒泡排序 属于交换排序 每次比较左右两个数 ,小的放左边 大的放右边 第一轮比较完 会将最大的那位放在最后 ,第二轮会把倒数第二大的放在倒数第二位 依次 ![这里写图

    相关 算法笔记 冒泡排序

    排序是指将一个无序序列按某个规则进行有序排列,而冒牌排序是排序算法中最基础的一种。先给出一个序列a,其中元素的个数为n,要求将他们按从小到大的顺序排序。 冒泡排序的本质在于

    相关 排序算法冒泡排序

    一、前言     冒泡排序是一种交换排序。     什么是交换排序呢?     答曰:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要

    相关 排序算法--冒泡排序

    1.基本思想:每次比较两个相邻的元素,如果顺序错误,则交换这两个元素的位置。 例如:对5,3,4,9,6这五个数按从小到大排序。 第一趟排序:先比较第一位数5和第二位

    相关 排序算法——冒泡排序

    排序算法——冒泡排序 > 冒泡排序:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的比较,从开始的第一对到结尾的最后一对。通过每一趟的比较,