C语言:冒泡排序

        我们的一生很长很长,足够我们去寻找那个让你能铭记的人,我们的一生也很短,短到我们应该抓紧时间去记住一些重要的东西和人。

一、冒泡排序简介

 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法
重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

二、冒泡排序图解

1.创建数组,用来存放数据

2.输入整数存入数组

3.进行第一次冒泡

1)将第一个数据与第二个数据进行比较,较大的数据存放到第二个数据的位置。

替换前:

替换后:

2)将第二个数据与第三个数据进行比较,较大的数据存放到第三个数据的位置。

替换前:

替换后:

3)将第三个数据与第四个数据进行比较,较大的数据存放到第四个数据的位置。

替换前:

替换后:

4)将第四个数据与第五个数据进行比较,较大的数据存放到第五个数据的位置。

替换前:

替换后:

5)将第五个数据与第六个数据进行比较,较大的数据存放到第六个数据的位置。

替换前:

替换后:

6)将第六个数据与第七个数据进行比较,较大的数据存放到第七个数据的位置。

替换前:

替换后:

7)将第七个数据与第八个数据进行比较,较大的数据存放到第八个数据的位置。

替换前:

替换后:

8)这样就把数组中最大的数据存放到了最后的位置

4.重复进行,完成冒泡排序

        然后在进行一次可以把第二大的数据存放到倒数第二的位置,再重复进行直到把数据从小到大一次存放在数组中。

三、冒泡排序实现

1.冒泡排序流程图

2.冒泡排序代码(升序)

#include<stdio.h>

int main(int argc, char const *argv[])
{
  int t;
  //int a[10]={5,68,78,21,54,36,9,65,74,10};
  
  #if 1
  int a[8];//可更改[]中的值,来改变数组大小
  printf("请输入%d个整数:\n",sizeof(a)/sizeof(a[0]));
  for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++)
  {
    scanf("%d",&a[i]);
  }
  #endif

  printf("排序前数组:\n");
  for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++)
  {
    printf("%d ",a[i]);
  }
  //冒泡排序:将第1个位置的数与第2个位置的数比较,较大的放在第2个位置;
  //        然后将第2个位置的数字,再与第3个位置的数字比较,较大的放在第3个位置;依次循环到最后,将最大值放到最后位置。
  //        执行第二次,将第二大的值放到倒数第二位置。依次循环完成冒泡排序。
  for (int i = 0; i < sizeof(a)/sizeof(a[0])-1; i++)
  {
    for (int j = 0; j < sizeof(a)/sizeof(a[0])-1-i; j++)
    {
      if (a[j]>a[j+1])
      {
        t=a[j];
        a[j]=a[j+1];
        a[j+1]=t;
      }
    }
  }
  putchar(10);
  printf("排序后数组:\n");
  for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++)
  {
      printf("%d ",a[i]);
  }
  putchar(10);

  return 0;
    
}

结果展示:

冒泡排序-排序过程 设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。 算法示例 49 13 13 13 13 13 13 13 38 49 27 27 27 27 27 27 65 38 49 38 38 38 38 38 97 65 38 49 49 49 49 49 76 97 65 49 49 49 49 49 13 76 97 65 65 65 65 65 27 27 76 97 76 76 76 76 49 49 49 76 97 97 97 97 Procedure BubbleSort(Var R : FileType) //从下往上扫描的起泡排序// Begin For I := 1 To N-1 Do //做N-1趟排序// begin NoSwap := True; //置未排序的标志// For J := N - 1 DownTo 1 Do //从底部往上扫描// begin If R[J+1]< R[J] Then //交换元素// begin Temp := R[J+1]; R[J+1 := R[J]; R[J] := Temp; NoSwap := False end; end; If NoSwap Then Return//本趟排序中未发生交换,则终止算法// end End; //BubbleSort// 该算法的时间复杂性为O(n2),算法为稳定的排序方 冒泡排序-冒泡排序法的改进 比如用冒泡排序将4、5、7、1、2、3这6个数排序。在该列中,第二趟排序结束后,数组已排好序,但计算机此时并不知道已经反排好序,计算机还需要进行一趟比较,如果这一趟比较,未发生任何数据交换,则知道已排序好,可以不再进行比较了。因而第三趟比较还需要进行,但第四、五趟比较则是不必要的。为此,我们可以考虑程序的优化。 为了标志在比较中是否进行了,设一个布尔量flag。在进行每趟比较前将flag置成true。如果在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,如果它仍为true(表明在该趟比较中未发生一次数据交换)则结束排序,否则进行下一趟比较。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值