手撕排序算法:冒泡排序

07-19 744阅读

文章目录

  • 1.算法思想
  • 2.冒泡排序具体过程
  • 3.算法分析
    • 3.1时间复杂度
    • 3.2空间复杂度
    • 4.算法的优缺点
      • 4.1算法的优点
      • 4.2算法的缺点
      • 5.冒泡排序优化方案
      • 6.算法实现
      • 7.实战
        • 7.1 力扣88. 合并两个有序数组
        • 7.2力扣2148.元素计数
        • 7.3力扣1046.最后一块石头的重量

          冒泡排序(Bubble Sort)是一种简单的排序算法,通过多次比较和交换相邻的元素,将数组

          手撕排序算法:冒泡排序
          (图片来源网络,侵删)

          中的元素按升序或降序排列。

          1.算法思想

          冒泡排序的基本思想是:每次遍历数组,比较相邻的两个元素,如果它们的顺序错误,就将它

          们交换,直到数组中的所有元素都被遍历过。

          具体的算法步骤如下:

          第一步、遍历数组的第一个元素到最后一个元素。

          第二步、对每一个元素,与其后一个元素进行比较。

          第三步、如果顺序错误,就将它们交换。

          重复上述步骤,直到数组中的所有元素都被遍历过至少一次。

          2.冒泡排序具体过程

          首先需要将「第一个元素」和「第二个元素」进行「比较」,如果前者大于后者,则进行「交

          换」,

          然后再比较「第二个元素」和「第三个元素」,以此类推,直到「最大的那个元素」被移动

          到「最后的位置」。

          然后,进行第二轮「比较」,直到「次大的那个元素」被移动到「倒数第二的位置」

          最后,经过一定轮次的「比较」和「交换」之后,一定可以保证所有元素都是「升序」排列

          的。

          3.算法分析

          3.1时间复杂度

          我们假设「比较」和「交换」的时间复杂度为O(1)(为什么这里说假设,因为有可能要「比

          较」的两个元素本身是数组,并且是不定长的,所以只有当系统内置类型,我们才能说这两个操

          是0(1)的)。

          「冒泡排序」中有两个嵌套循环。

          外循环正好运行一1次迭代。但内部循环运行变得越来越短:

          当i=0,内层循环n一1次「比较」操作。

          英雄哪里出来182585442552122

          当i=1,内层循环n一2次「比较」操作。

          当i=2,内层循环n一3次「比较」操作。

          当i=n一2,内层循环1次「比较」操作。

          当i=n一1,内层循环0次「比较」操作。

          英雄哪里出来海豚知通552122

          因此,总「比较」次数如下:

          总的时间复杂度为:O(n^2)

          3.2空间复杂度

          由于算法在执行过程中,只有「交换」变量时候采用了临时变量的方式,而其它没有采用任何

          的额外空间,所以空间复杂度为O(1)。

          4.算法的优缺点

          4.1算法的优点

          1.简单易懂:冒泡排序的算法思想非常简单,容易理解和实现。

          2.稳定排序:冒泡排序是一种稳定的排序算法,即在排序过程中不会改变相同元素的相对顺

          序。

          4.2算法的缺点

          1.效率较低:由于需要进行多次比较和交换,冒泡排序在处理大规模数据时效率较低。

          2.排序速度慢:对于大型数组,冒泡排序的时间复杂度较高,导致排序速度较慢。

          5.冒泡排序优化方案

          「冒泡排序」在众多排序算法中效率较低,时间复杂度为O(2)。

          想象一下,当有=100000个数字。即使我们的计算机速度超快,并且可以在1秒内计算

          10^8次操作,但冒泡排序仍需要大约一百秒才能完成。

          但是,它的外层循环是可以提前终止的,例如,假设一开始所有数字都是升序的,那么在首轮「比较」的时候没有发生任何的「交换」,那么后面也就不需要继续进行「比较」了,直接跳出外

          层循环,算法提前终止。

          「改进思路」如果我们通过内部循环完全不交换,这意味着数组已经排好序,我们可以在这个

          点上停止算法。

          6.算法实现

          void Bottle_Sort(int nums[],int numsSize) {  
              for (int i = 0; i   
                  for (int j = 0; j  
          

          7.实战

          7.1 力扣88. 合并两个有序数组

          给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

          请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

          **注意:**最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

          void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {  
              int i,j,num;  
              for(i=0;i  
                  nums1[m+i]=nums2[i];  
              }  
              for(i=0;i  
                  for(j=0;j  
                      if(nums1[j]nums1[j+1])  
                      {  
                          num=nums1[j];  
                          nums1[j]=nums1[j+1];  
                          nums1[j+1]=num;  
                      }  
                  }  
              }  
          }
            
              for (int i = 0; i   
                  for (int j = 0; j 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]