冒泡排序(附图详解)

简介: 冒泡排序(附图详解)

什么是冒泡排序?



将两个相邻的元素进行比较,如果前面的元素大(从小到大排序),就交换两个元素,重复这样往后依次操作,最终的结果是将一个数列按从大小或则从小到大的顺序排列;


冒泡排序的算法思想



1.先把第一个和第二个元素进行比较,如果大小顺序与目的顺序不同,就进行交换;

2.第一次比较后,把第二个和第三元素进行比较,如果与目的顺序不同,再进行交换;

3.重复上述操作,将这个数列遍历完一边后,最大或则最小的数(取决于你想排的顺序)就被放在了最后;        

4.像这样,每遍历完一遍,就会将一个元素放在正确位置,所以我们遍历的次数等于所需要排列的元素个数减去一(即如果我们想要将10个数排序,就需要遍历9次);


算法图解


8040331c645b453ba8807b5e58ed9299.png


参考代码



#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Print(int arr[],int n)
{
  int i = 0;
  for (i = 0; i < n; i++)
  {
    printf("%d ",arr[i]);
  }
}
int main()
{
  int arr[] = { 2,7,1,10,8,9,6,4,3,5 };
  int len = sizeof(arr)/sizeof(arr[0]);
  int i = 0;
  int j = 0;
  for (i = 0; i < len-1; i++)
  {
    for (j = 0; j < len-i-1; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        int tmp = arr[j];
        arr[j] = arr[j +1];         //元素的交换
        arr[j + 1] = tmp;
      }
    }
    Print(arr,len);                     //打印函数,打印排序过程
    printf("\n");
  }
  return 0;
}


运行结果

4caaebf5922347fe9d6ac8bd6b90b726.png


代码优化

如果数列本是有序的,就不需要排序了。


优化代码



void Print(int arr[], int n)
{
  int i = 0;
  for (i = 0; i < n; i++)
  {
    printf("%d ", arr[i]);
  }
}
int main()
{
  int arr[] = {1,2,3,4,5,6,7,8,9 };
  int len = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  int j = 0;
  int flag = 1;                             //标记
  for (i = 0; i < len - 1; i++)
  {
    for (j = 0; j < len - i - 1; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        flag = 0;                    //如果一次遍历数组中有一次交换,说明数组无序
        int tmp = arr[j];            //将flag赋值变为0;若有序则不变
        arr[j] = arr[j + 1];
        arr[j + 1] = tmp;
      }
    }
    if (flag == 1)                       //若flag没改变,说明数组有序
    {
      break;                           //跳出循环
    }
    Print(arr, len);
    printf("\n");
  }
  Print(arr,len);
  return 0;
}


运行结果

(应为一次)


16ca972814484954a99d6a43043bee27.png


目录
相关文章
|
3月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
62 0
|
3月前
Leetcode第38题(外观数列)
LeetCode第38题要求生成外观数列的第n项,该数列从数字1开始,每一项都是对前一项的描述,例如第1项是"1",第2项是"11",第3项是"21",以此类推。
39 0
|
7月前
|
算法 搜索推荐 数据可视化
【漫画算法】插入排序:插入宝石的传说
【漫画算法】插入排序:插入宝石的传说
|
8月前
|
测试技术
【错题集-编程题】比那名居的桃子(滑动窗口 / 前缀和)
【错题集-编程题】比那名居的桃子(滑动窗口 / 前缀和)
|
人工智能 算法 C++
洛谷 P1090 合并果子(贪心)
洛谷 P1090 合并果子(贪心)
150 0
|
8月前
leetcode-38:外观数列
leetcode-38:外观数列
54 0
|
算法 安全 Swift
LeetCode - #38 外观数列
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #38 外观数列
|
算法 搜索推荐
请问你见过吐代码的泡泡吗(冒泡排序)
请问你见过吐代码的泡泡吗(冒泡排序)
54 0
|
搜索推荐 算法
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
118 0
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
【每日一题Day67】LC1739放置盒子 | 找规律+贪心 二分查找
有一个立方体房间,其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子,每个盒子都是一个单位边长的立方体。
122 0
【每日一题Day67】LC1739放置盒子 | 找规律+贪心 二分查找