一个典列来带领大家了解冒泡排序思想

简介: 一个典列来带领大家了解冒泡排序思想

冒泡排序算法的原理如下: [1]  


原文链接为:冒泡排序_百度百科


比较相邻的元素。如果第一个比第二个大,就交换他们两个。 [1]


对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 [1]


针对所有的元素重复以上的步骤,除了最后一个。 [1]


持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 [1]


0a2653c851af460fa595bd959398a8f1.png


上面的思想就是冒泡排序的精华所在!对于此,我们可以定义一个数组,比如:对一个整型数组进行排序,将乱序排为升序!整型数组为:arr[]={2,1,3,7,5,9,6,8,0,4};  排序后的升序为:arr[]={0,1,2,3,4,5,6,7,8,9};


下面请看笔者思路:


6de278e6d6694ce5bb08e7e842b7e74b.png


通过上面的代码,我们可以看出来,一趟冒泡排序确定一个数!因此有n个数,我们就需要进行n-1趟冒泡排序(最后一趟就没有必要进行,因为在最后一趟时候,就已经没有需要比较的数字了!!所以,可以进行n-1趟冒泡排序!


但是对于冒泡排序看着虽然很简单,其实写起来,只要注意一下那几个简短的代码,其他的也就没有什么难度,但是,冒泡排序有一个缺陷:只能进行一种类型的排序,不能排列多种类型!!!若有想法者:请参考:qsort(C语言标准库提供的排序函数)可以实现对多种数组:(浮点型,字符型,……)实现排序!!但思想是按照快速排序的想法而来,在此,笔者就不做过多的关于sqort函数的讲述!!


言归正传!下面我们来回到冒泡排序的代码上面!下面请欣赏笔者的对于用整型数组实现冒泡排序!!


#include <stdio.h>
void bubble_sort(int arr[], int sz)
{//缺陷:int arr[]  只能排序整型数组
  int i = 0;
  for (i = 0; i < sz - 1; i++)//趟数
  {
  int j = 0;
  for (j = 0; j < sz - 1 - i; j++)//一趟冒泡排序的过程!
  {
    if (arr[j] > arr[j + 1])
    {
    int tmp = arr[j];
    arr[j] = arr[j + 1];
    arr[j + 1] = tmp;
    }
  }
  }
}
void print(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  printf("\n");
}
int main()
{
  //冒泡排序
  //对整型数组进行排序——排序为升序!
  int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
  //乱序的整型数组!
  int sz = sizeof(arr) / sizeof(arr[0]);//计算出数组有几个元素
  bubble_sort(arr, sz);
  print(arr, sz);
  return 0;
}


在上述代码中,我们需要着重注意的部分就是在于bubble_sort函数部分:下面笔者就这一部分代码进行简单讲解:


void bubble_sort(int arr[], int sz)
{//缺陷:int arr[]  只能排序整型数组
  int i = 0;
  for (i = 0; i < sz - 1; i++)//趟数
  {
  int j = 0;
  for (j = 0; j < sz - 1 - i; j++)//一趟冒泡排序的过程!
  {
    if (arr[j] > arr[j + 1])
    {
    int tmp = arr[j];
    arr[j] = arr[j + 1];
    arr[j + 1] = tmp;
    }
  }
  }
}

首先:1.对于n个数字,我们需要进行n-1趟冒泡排序,毕竟最后一趟冒泡排序,因为没有数字比较,所以也就不用进行了!!2.每次的冒泡排序都会有一个沉底的部分,这个沉底的就是确定下来的值!不用再参与比较大小,所以每次都会进行-1运算,但是随着趟数 i 的增加,细心的你,不知道是否能够发现趟数 i  与每次冒泡排序执行 j 过程之间的关系呢???每次比较的都是arr[j]与arr[j+1],而且这样写,也不用害拍数组越界!毕竟第一次时候,j=sz-1-0=sz-1,所以此时的arr[j+1]恰好指向最后一个元素!!


代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


当然,对于数组arr[]读者也可以进行键盘输入,这个可以实现对多组数组进行排序,但是笔者在此就不做过多的更改,因为,太简单了!!!


34e8d716411043c08c7ffba9fbba23de.png


对于该冒泡排序的思想,笔者已将用代码来进行讲解完毕,如果读者有不同的意见或者想法,请及时对笔者进行私聊哦!!!


相关文章
|
9月前
|
存储 缓存 算法
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
|
9月前
|
并行计算 算法 索引
数据结构与算法 分治
数据结构与算法 分治
61 0
|
9月前
|
机器学习/深度学习 算法 Java
「程序员必须掌握的算法」动态规划「中篇」
「程序员必须掌握的算法」动态规划「中篇」
|
自然语言处理 算法 机器人
算法之路:动态规划(一)
学习动态规划后写的练习题。
算法之路:动态规划(一)
|
算法 Java
数据结构与算法之打家劫舍(二)&&动态规划思想
数据结构与算法之打家劫舍(二)&&动态规划思想
120 0
数据结构与算法之打家劫舍(二)&&动态规划思想
|
算法 Java C++
数据结构与算法之打家劫舍(一)&&动态规划思想
数据结构与算法之打家劫舍(一)&&动态规划思想
131 0
数据结构与算法之打家劫舍(一)&&动态规划思想
|
人工智能 算法 搜索推荐
面试基础篇——快速排序
面试基础篇——快速排序
131 0
面试基础篇——快速排序
|
算法 搜索推荐 索引
【算法实践】手把手带你快速实现插入排序
每学习一个新东西总要首先知道他是什么,能做什么,怎么做,类似于哲学中的三大问题:我是谁,从哪里来,要到哪里去。或许我们一直徘徊在哲学的迷思中,也许一直想不明白,但是在思考的过程中或许会越来越接近真相,也让自己变得更强,所以进步从思考开始,我们学习算法也一样,我们得知道他是什么,思考他能解决哪些问题,具体怎么实现。那插入排序是什么呢?使用它需要满足什么条件?
123 1
|
存储 算法 C++
深入浅出广度和深度优先搜索算法
广度优先搜索,通俗的理解就是,地毯式层层推进,从起始顶点开始,依次往外遍历。广度优先搜索需要借助队列来实现,遍历得到的路径就是起始顶点到终止顶点的最短路径。深度优先搜索用的是回溯思想,非常适合用递归。
198 0
|
算法 搜索推荐 索引
【面试:基础篇02:冒泡排序】
【面试:基础篇02:冒泡排序】
125 0