qidao123.com ToB IT社区-企服评测·应用市场

标题: C++实现排序算法:冒泡排序 [打印本页]

作者: 立聪堂德州十三局店    时间: 2024-12-8 15:23
标题: C++实现排序算法:冒泡排序
目次
前言
冒泡排序性质
C++代码实现冒泡排序
冒泡图解
第一趟排序
第二趟排序
第三趟排序
排序结果
结语

前言
        冒泡排序的根本思想是通过从前往后(从后往前)两两比较,若为逆序(即arr < arr[i + 1])则交换。整个排序方式像是在水底泡泡往上浮。本文会给出冒泡排序的C++实现,并辅以图形解释冒泡排序的过程。
冒泡排序性质

排序时间复杂度空间复杂度是否稳定
冒泡排序O(n^2)O(1)
C++代码实现冒泡排序

   冒泡排序C++实现
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. void Print(vector<int> &arr)
  5. {
  6.     for (auto v : arr)
  7.     {
  8.         cout << v << ' ';
  9.     }
  10.     cout << endl;
  11. }
  12. int main()
  13. {
  14.     // arr待排序的vector对象。这里以将arr最终调整为升序为例
  15.     vector<int> arr{9, 1, 6, 7, 6};
  16.     for (int i = 0; i < arr.size(); i++)
  17.     {
  18.         // flag 为一个标志, 如果有一趟没有进行数据交换,
  19.         // 则该序列已经为有序序列, 可以提前跳出循环, 完成排序
  20.         bool flag = false;
  21.         for (int j = 0; j < arr.size() - 1 - i; j++)
  22.         {
  23.             if (arr[j] > arr[j + 1])
  24.             {
  25.                 // 满足条件 进行元素交换
  26.                 std::swap(arr[j], arr[j + 1]);
  27.                 // 修改标志位,证明本趟排序中发生过元素交换
  28.                 flag = true;
  29.             }
  30.         }
  31.         // 判断这次比较过程中是否进行交换,
  32.         // 如果没有进行交换则待排序序列已经为有序序列。就可以提前跳出循环。
  33.         if (!flag)
  34.         {
  35.             break;
  36.         }
  37.     }
  38.     // 输出排序后的结果。
  39.     Print(arr);
  40.     return 0;
  41. }
复制代码
运行结果
  

  冒泡图解

下标01234
初始序列91676
第一趟排序

留意:这里的一趟以一次完整的内层循环作为一趟,即在本趟排序中 i 值不变。
   
第一趟第一次比较i == 0
j == 0j+1 == 1
91676
当前arr[j] > arr[j+1] 举行交换  j++ == 1
本次比较后交换结果19676
  
第一趟第二次比较i == 0 
j == 1j+1 == 2
19676
当前arr[j] > arr[j+1] 举行交换  j++ == 2
本次比较后交换结果16976
  
第一趟第三次比较i == 0 
j == 2j+1 == 3
16976
当前arr[j] > arr[j+1] 举行交换  j++ == 3
本次比较后交换结果16796
  
第一趟第四次比较i == 0 
j == 3j+1 == 4
16796
当前arr[j] > arr[j+1] 举行交换  j++ == 4
本次比较后交换结果16769
  
当前 j == 4 不满足进入循环条件 j < arr.size() - 1 - i 跳出内层循环, i++ = 2 进入第二趟排序.
          本趟排序中将 9 这个序列中最大的值,调解到最后一个位置。所以当前只有 前arr.size() - 1 - i个元素处于无序状态。
  第二趟排序

   
下标01234
第二趟初始序列16769
  
第一次比较i == 1
j == 0j + 1 == 1
16769
当前arr[j] < arr[j+1] 不举行交换  j++ == 1
本次比较后交换结果16769
  
第二次比较i == 1
j == 1j++ == 2
16769
当前arr[j] < arr[j+1] 不举行交换  j++ == 2
本次比较后交换结果16769
  

第三次比较
i == 1
j == 2j++ == 3
16769
当前arr[j] > arr[j+1] 举行交换  j++ == 3
本次比较后交换结果16679
  
当前 j == 3 不满足进入循环条件j < arr.size() - 1 - i 跳出内层循环, i++ = 2 进入第三趟排序.
  第三趟排序

   
下标01234
第三趟初始序列16679
  
第三趟第一次比较i == 2
j == 0j+1 == 1
16679
当前arr[j] < arr[j+1] 不举行交换  j++ == 1
本次比较后交换结果16679
  
第三趟第二次比较i == 2
j == 1j+1 == 2
16679
当前arr[j] == arr[j+1] 不举行交换  j++ == 2
本次比较后交换结果16679
  
当前 j == 2 不满足进入循环条件j < arr.size() - 1 - i 跳出内层循环, 

本次排序过程中没有举行一次数据交换(示例代码中的 flag 标志位 没有被改变),

所以该序列,已经是有序序列了. 所以提前跳出循环. 排序成功.

  排序结果

   最终排序结果:  
下标01234
初始序列91676
最终排序结果16679
        根据结果,可以发现初始序列中和最终结果中的    6   和     6   的相对位置并没有发生改变,所以  冒泡排序是稳定  的  结语

        希望本文对你有所帮助,谢谢点赞关注收藏。假如有什么问题,欢迎私信或者批评区讨论。
感谢阅读



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com ToB IT社区-企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.5