冒泡排序(附图详解)

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

什么是冒泡排序?



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


冒泡排序的算法思想



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月前
|
算法 搜索推荐 数据可视化
【漫画算法】插入排序:插入宝石的传说
【漫画算法】插入排序:插入宝石的传说
|
4月前
|
存储 算法 搜索推荐
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
144 1
|
9月前
|
搜索推荐 算法 C语言
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(上)
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(上)
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(上)
|
9月前
|
搜索推荐 算法
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(下)
手撕排序算法3:优化版冒泡排序和快速排序的三种方法(包括三数取中,小区间优化,递归版本)(下)
|
算法 搜索推荐
请问你见过吐代码的泡泡吗(冒泡排序)
请问你见过吐代码的泡泡吗(冒泡排序)
42 0
|
算法 搜索推荐
选择排序与堆排序(还记得这些经典算法吗?)
选择排序与堆排序(还记得这些经典算法吗?)
选择排序与堆排序(还记得这些经典算法吗?)
|
搜索推荐 算法
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
99 0
【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)
|
搜索推荐 算法 C语言
【排序算法 下】带你手撕常见排序 (冒泡,快排,归并排序) (动图详解)
【排序算法 下】带你手撕常见排序 (冒泡,快排,归并排序) (动图详解)
148 0
【排序算法 下】带你手撕常见排序 (冒泡,快排,归并排序) (动图详解)
冒泡排序(简练版)(一看就懂)(对比选择排序)
冒泡排序(简练版)(一看就懂)(对比选择排序)
|
算法 搜索推荐
算法笔记(二)——快排,归并算法(做成模板题)
算法笔记(二)——快排,归并算法(做成模板题)
算法笔记(二)——快排,归并算法(做成模板题)