• 冒泡排序


    贵阳这个地方的天气变化好大呀,前两天晒大太阳,今天就冷的脚抖,简直不要太冷,但是不管怎么样,还是要学习的哟!

    冬天来了,春天确实还有一点远!

     好了,话不多说,我们来开始今天的学习。今天我们来讲冒泡排序,什么是冒泡排序呢?

    冒泡排序是一种基本的排序算法,其思想是通过比较两个相邻元素的大小,将较大的元素逐渐交换到数组的最末尾。

    1. 从数组的第一个元素开始,将其与相邻的元素进行比较。
    2. 如果当前元素大于相邻元素,则交换它们的位置,将较大的元素移动到后面。
    3. 继续比较与下一个元素,直到达到数组的末尾。
    4. 重复以上步骤,每次比较的次数减少一次。
    5. 重复执行上述步骤,直到所有元素都按照从小到大的顺序排序。

     那么我们现在来看看整体代码:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. void BubbleSort(int arr[], int sz)
    4. {
    5. for (int i = 0; i < sz-1; i++)//趟数
    6. {
    7. for (int j = 0; j < sz - 1 - i; j++)//一趟冒泡排序
    8. {
    9. if (arr[j] > arr[j + 1])
    10. {
    11. int tmp = arr[j];
    12. arr[j] = arr[j + 1];
    13. arr[j + 1] = tmp;
    14. }
    15. }
    16. }
    17. }
    18. int main()
    19. {
    20. int arr[] = { 5,7,9,4,3,6,8,1};//5 7 9 4 3 6 8 1
    21. int sz = sizeof(arr) / sizeof(arr[0]);//计算有多少个元素
    22. BubbleSort(arr,sz);
    23. for (int i = 0; i < sz; i++)
    24. {
    25. printf("%d ", arr[i]);
    26. }
    27. return 0;
    28. }

    看看运行效果:

     那么如果是以 9 1 3 4 5 6 7 8这样排序呢,我们是不是也还要进行那么多次的排序,我们是不是只用一趟排序之后就是我们希望看见的结果了,所以我们来改进一下我们的代码。我们假设flag = 1为最终排好的效果,如果进行交换了,我们就把 flag = 0,表示此时还不是我们想要的效果,还可以定义一个count来看看我们进行了多少次比较。

    1. int count = 0;
    2. void BubbleSort(int arr[], int sz)
    3. {
    4. for (int i = 0; i < sz; i++)//趟数
    5. {
    6. //int flag = 1;
    7. for (int j = 0; j < sz - 1 - i; j++)//一趟冒泡排序
    8. {
    9. count++;
    10. if (arr[j] > arr[j + 1])
    11. {
    12. int tmp = arr[j];
    13. arr[j] = arr[j + 1];
    14. arr[j + 1] = tmp;
    15. //flag = 0;
    16. }
    17. }
    18. /*if (flag == 1)
    19. {
    20. break;
    21. }*/
    22. }
    23. }
    24. int main()
    25. {
    26. int arr[] = {9,1,3,4,5,6,7,8, };//5 7 9 4 3 6 8 1
    27. int sz = sizeof(arr) / sizeof(arr[0]);
    28. BubbleSort(arr,sz);
    29. for (int i = 0; i < sz; i++)
    30. {
    31. printf("%d ", arr[i]);
    32. }
    33. printf("%d", count);
    34. return 0;
    35. }

    我们先把flag摒弃掉,看看总共比较了多少次:

     加上flag的判断后看看:

     可能有一些小伙伴有些疑惑了,为什么count放在比较的外面,而不放在if的里面,不是说比较了才加加吗?其实就是放在这里的,每一次进来都是要进行比较的,假设你上一次达到了你想要的排序,但是下一次进来还是要进行比较呀,看看要不要进行交换,如果不用交换的话,那么flag就不用变成0了,那么就可以执行到后面然后跳出循环

    好了,今天就到此结束咯!

    Good night!

  • 相关阅读:
    Docker容器搭建android编译环境
    laravel6 邮件发送注意事项
    多线程学习
    CSS 样式
    RockerMq--入门
    C++ 【类和对象: 析构函数,拷贝构造函数,运算符重载 --2】
    如何区分和选择EML、DML两种激光器
    零代码编程:用ChatGPT多线程批量将PDF文档转换为word格式
    Leetcode73矩阵置零
    【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)
  • 原文地址:https://blog.csdn.net/2302_77675796/article/details/134365962