> 文档中心 > 冒泡排序法究极详细讲解*

冒泡排序法究极详细讲解*


冒泡排序法究极详细讲解*

前言:冒泡排序法是排序问题中最通解与基础的方法。它是利用循环结构对一连串的数字进行排序。接下来就和大家分享具体原理与食用方法。

文章目录

    • 冒泡排序法究极详细讲解*
  • 一、基本原理分析
  • *二、具体代码实现
  • 三、一点优化

一、基本原理分析

首先我们当知道所谓 冒泡排序法 就是不断让相邻的两个数进行大小比较然后将与自己排序方向相反的数一个个一趟趟往后移。例如此处要使 6 5 4 3 2 1这六个数字进行从小到大的排序。如图
在这里插入图片描述

一步步比较相邻的两个数将大的数与小的数交换顺序,将最大值一个个往后移,最终使得效果呈现为从小到大的数字排序。

*二、具体代码实现

首先定义一个数组来放要进行排序的数字。

当然这个 冒泡排序法 主要是利用循环结构的嵌套来实现的,外部的循环结构描述的应该是这个程序排序总共要走几趟的问题,而内部的循环结构则描述的是每趟循环结构要比较几次的问题。

之后我们接着搞明白两个问题
1.排序过程中要走几趟? 2.每一趟中要比较几次?

1.具体如上图,走完第一趟,6就会移到最后一位;同理依次走下去5,4,3,2也会一个个往后排。那么总共下来 6 个数的排序就走了 5 趟。以此类推共需比较 n-1 趟。(设有n个数)
2.走第一趟时,从6到1我们要分别比较五次,而走完第一趟当 6 排到最后一位时,第二趟中我们只需要比较1~5中两两相邻的数,即四次…以此类推,(设这是走的第 i 趟)每趟需比较n-1-i次

//从小到大排列这九个数#includeint main(){int arr[]={987654321}int j,i;  int z;for(i=0;i<8;i++)//这里就是上面说的n-1,所以是判断条件为i<8{for(j=0;j<8-i;j++)//这里j<8-1就对应上面的n-1-i{if(arr[i]>arr[i+1]){ z=arr[i];  //这里就是比较后两两交换的代码  arr[i]=arr[i+1];  arr[i+1]=z;}}}for(i=0;i<=8;i++){printf("%d",arr[i]);//这里把改变后的数组用循环依次打印出来}return 0;}

三、一点优化

当然既然是通解法,那么在一些情况下用起来就会不那么方便,代码运行的相对效率会低很多。比如当给出的一串数字的顺序是已经符合要求的时候,程序在运行的时候也会一步步一趟趟地进行比较,再进行排序,这样就会使得写出的程序低效。所以在食用过程中我们应当对此代码进行适当的优化,提高逼格。具体思路就是在循环外部定义一个新的变量并为它赋值,然后在内层循环即执行比较的代码块中给这个变量进行重新赋值,这样一来在走的每一趟中如果只要有其中一趟是已经排好序的,那么它就不符合内层的if条件,也就不会进入循环语句中给这个变量重新赋值。有了这样的思路我们可以在大的循环结构中添加一个判断语句,判断这个新变量的值有没有被重新赋值。如果没有被重新赋值就跳出循环。于是就可以检验出是否已经排好序,知道是否有必要继续循环下去,从而大大提升程序质量。具体如下

#includeint main(){    int arr[3] = {0};int z = 0;     int i = 0;int j = 0;int count = 0;//先在外面创建并初始化这个变量for (i = 0; i <= 2; i++){scanf("%d", &arr[i]);}    for (j = 0; j < 2; j++)    {for (i = 0; i < 2 - i; i++){if (arr[i] > arr[i + 1]){int count = 1;//如果符合条件了就在这里重新赋值z = arr[i + 1];arr[i + 1] = arr[i];arr[i] = z;}}   if (count != 1)//这里便是在判断是否有进入内层循环的if 语句break;}printf("%d", arr[0]);    return 0;    }  

好了,今天的相关内容就到这里。笔者编写不易,觉得好的话可以给个三连噢。也希望大家能对写的不好的地方多多指正。往后会一直坚持更博客,写的越来越好的!