首页 > 编程语言 >必学的排序算法——冒泡排序

必学的排序算法——冒泡排序

时间:2024-10-16 23:21:17浏览次数:9  
标签:stones nums int 必学 冒泡排序 算法 排序 nums1

目录

前言

冒泡排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解冒泡排序算法。
在这里插入图片描述

一、什么是冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法,其基本思想是通过多次遍历待排序的数列,比较相邻元素的值,并在必要时交换它们的位置,从而将最大的元素逐步“冒泡”到数列的末尾。这个过程会重复进行,直到整个数列有序为止。

二、冒泡排序的的基本步骤

1.初始化:设定一个标志位(通常是布尔值),用于优化算法(可选)。

2.遍历数列:从数列的第一个元素开始,到倒数第二个元素结束。

3.比较和交换
比较相邻的两个元素。
如果前一个元素比后一个元素大(对于升序排序),则交换它们的位置。

4.优化(可选):如果在一次完整的遍历中没有发生任何交换,说明数列已经有序,可以提前结束排序。

5.重复:重复步骤2到步骤4,直到没有需要交换的元素为止。

三、冒泡排序的特点

时间复杂度:
最好情况:O(n)(数组已经有序时,通过优化可以提前结束)
最坏情况:O(n^2)(数组完全逆序时)
平均情况:O(n^2)

空间复杂度:O(1)(原地排序,不需要额外的存储空间)
稳定性:冒泡排序是稳定的排序算法,即相等元素的相对顺序在排序前后不会改变。

尽管冒泡排序的时间复杂度较高,但其实现简单,对于小规模数据或特定场景下的简单排序任务,仍然有一定的应用价值。

四、冒泡排序算法图解

在这里插入图片描述

五、经典例题

1.合并两个有序数组

(帅哥们这个蓝色字体可以点进去看原题)

代码题解

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        nums1.resize(m);
        for(int i=0;i<n;i++){
            int x=nums2[i];
            nums1.push_back(x);//将nums2数组插入nums1中
        }
        for(int i=nums1.size()-1;i>=0;i--){//我这个是往前冒,就是把最小值放前面
            for(int j=0;j<i;j++){
                if(nums1[j+1]<nums1[j]){
                    int t=nums1[j+1];
                    nums1[j+1]=nums1[j];
                    nums1[j]=t;
                }
            }
        }
    }
};

2.元素计数

(帅哥们这个蓝色字体可以点进去看原题)

代码题解

class Solution {
public:
    int countElements(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            for(int j=i+1;j<nums.size();j++){
                if(nums[j]<nums[i]){
                    int t=nums[j];
                    nums[j]=nums[i];
                    nums[i]=t;
                }
            }
        }
        int cnt=0;
        for(int i=1;i<nums.size()-1;i++){就是遍历除了第一个和最后一个,从1开始遍历到倒数第二个满足条件加1
            if(nums[i]!=nums[0]&&nums[i]!=nums.back())cnt++;
        }
        return cnt;
    }
};

3.最后一块石头的重量

(帅哥们这个蓝色字体可以点进去看原题)

代码题解

class Solution {
    void bubbleSort(vector<int>& stones){
        for(int i=0;i<stones.size();i++){
            for(int j=i+1;j<stones.size();j++){
                if(stones[j]<stones[i]){
                    int t=stones[j];
                    stones[j]=stones[i];
                    stones[i]=t;
                }
            }
        }
    }
public:
    int lastStoneWeight(vector<int>& stones) {
        while(stones.size()>1){//直到石头数剩一个或零个结束
            bubbleSort(stones);
            int n=stones.size();//每次相减到都要排序一次
            int v=stones[n-1]-stones[n-2];
            stones.pop_back();
            stones.pop_back();
            if(v||stones.size()==0)stones.push_back(v);//这个过程结束结果就是数组第一个值,如果最后一次相减为0,就插入到数组,第一个值不能什么都没有
        }    
        return stones[0];
    }
};

六、结语

学习算法是一个很艰难,漫长的过程,我们要克服一切困难,学习算法本就是由易到难,我相信通过我们坚持不懈的努力一定能理解并熟练掌握其中细节,加油。
在这里插入图片描述

希望各位帅哥点赞关注支持一下
在这里插入图片描述

标签:stones,nums,int,必学,冒泡排序,算法,排序,nums1
From: https://blog.csdn.net/ycs66/article/details/142993385

相关文章

  • 选择排序,插入排序,快速排序的java简单实现
    代码功能以下Java代码包含了三个排序算法的实现:选择排序(SelectionSort):通过不断选择剩余元素中的最小值来排序数组。插入排序(InsertionSort):通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。快速排序(QuickSort):使用分治法,通过一个基准值......
  • 使用MySQL之排序检索数据
    排序数据子句(clause):SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。子句的例子有SELECT语句的FROM子句等。为了明确地排序用SELECT语句检索出的数据,可使用ORDERBY子句。ORDERBY子句取一个或多个列的名字,据此对输出进行排序......
  • 每日回顾:简单用C写 直接插入排序、希尔排序
    直接插入排序直接插入排序(StraightInsertionSort)是一种简单直观的排序算法。它的基本思想是将未排序的数据插入到已排序的序列中。大致思想:使用2个数组下标指针end、i模拟数组元素逐个进行插入的过程;i每递增一次,代表数组新插入一个元素。在这次循环中,end将逐渐递......
  • 数据结构八大排序的java实现
    冒泡排序package排序;importjava.util.Arrays;publicclassBubbleSort{   publicstaticvoidmain(String[]args){      int[]arr={5,7,4,2,0,3,1,6};      sort(arr);      System.out.println(Arrays.toString(arr));   }......
  • 深度解析计数排序:原理、特性与应用
    目录......
  • python如何将list排序
    python提供了对list排序的两种方法1、使用list内建函数sort排序list.sort(key=None,reverse=False)eg:In [57]: l=[27,47,3,42,19,9]In [58]: l.sort()In [59]: lOut[59]: [3, 9, 19, 27, 42, 47]上面这种是直接对l列表里面的元素排序,sort()函数还提供......
  • C++ 排序算法(选择、冒泡、插入)
    八、选择排序(从小到大): 选择排序的基本思想是:每一趟从待排序的数据中,通过“打擂台”比较选出最小元素,放在这些数据的最前面。这样,第一趟把n个数中(第1个到第n个)最小的放在第一个位置,第二趟把剩余的n-1个数中(第2个到第n个)最小的放在第二个位置,第三趟把剩余的n......
  • 【数据结构】:破译排序算法--数字世界的秩序密码(二)
    文章目录前言一.比较排序算法1.`BubbleSort`冒泡排序1.1.冒泡排序原理1.2.冒泡排序过程1.3.代码实现1.4.复杂度和稳定性2.`QuickSort`快速排序2.1递归快速排序2.1.1.递归快速排序原理2.1.2.递归快速排序过程2.1.3.代码实现2.2.非递归快速排序2.2.1.非递归快速排序原......
  • 合并两个排序的链表
    输入两个链表,并将它们的值按照递增的顺序合并成一个新的链表。题目要求如下:  我们可以创建两个新的链表,其中一个作为中间变量来存储合并后的链表,另一个链表记录中间链表并作为返回值返回。代码如下:/***structListNode{* intval;* structListNode*next;*}......
  • 堆排序题解
    给定一个整数序列,请按非递减序输出采用堆排序的各趟排序后的结果。输入格式:测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。输出格式:对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。输入样例......