C语言:冒泡排序法(升序排序法)

简介: 思路分析1.相邻两个数两两相比,n[i]跟n[j+1]比,如果n[i]>n[j+1],则将连个数进行交换,2.j++, 重复以上步骤,第一趟结束后,最大数就会被确定在最后一位,这就是冒泡排序又称大(小)数沉底,3.i++,重复以上步骤,直到i=n-1结束,排序完成。

动态演示:


bb3cebed8f8247e0b0eedec8d09b9c46.gif


思路分析


相邻两个数两两相比,n[i]跟n[j+1]比,如果n[i]>n[j+1],则将连个数进行交换,


j++, 重复以上步骤,第一趟结束后,最大数就会被确定在最后一位,这就是冒泡排序又称大(小)数沉底,


i++,重复以上步骤,直到i=n-1结束,排序完成。


负杂度分析


不管原始数组是否有序,时间复杂度都是O(n2)。因为没一个数都要与其他数比较一次,(n-1)2次,分解:n2+2n-1, 去掉低次幂和常数,剩下n2,所以最后的时间复杂度是n2


空间复杂度是O(1),因为只定义了一个辅助变量,与n的大小无关,所以空间复杂度为O(1)


如果只交换5列数:

cc373fbd5dd344e59650ea5df4b5dcc3.png1233bd720a7b4cdca77aca8ced12be86.png9c2b839c6a184a0b9803308ec03eddea.png

# 1.图解如下:2fbf2bfac721471c8cafb69f26c0ac0e.png


2.冒泡排序是什么意思?


103eec2a19ae48d5a4eb8ff4ffa9dbd7.png

3.冒泡排序升序思路:


d79522bccc5647769721e3b9d5648997.pngbdf1d268ce45423a81fd5c4e0c572062.png19bed3c30ef341a99bd556c650f61307.png


核心代码如下:

for (i = n - 1; i > 0; i--)
    {
        for (j = 0; j < i; j++)
        {
            if (a[j] > a[j + 1])
            {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }

ddc0f9216a8a4776a2208443336609de.png


4.PTA例题:


本题要求使用冒泡法排序,将给定的n个整数从小到大排序后输出,并输出排序过程中每一步的中间结果。


冒泡排序的算法步骤描述如下:


第1步:在未排序的n个数(a[0]〜 a[n−1])中,从a[0]起,依次比较相邻的两个数,若邻接元素不符合次序要求,则对它们进行交换。本次操作后,数组中的最大元素“冒泡”到a[n−1]; 第2步:在剩下未排序的n−1个数(a[0] 〜 a[n−2])中,从a[0]起,依次比较相邻的两个数,若邻接元素不符合次序要求,则对它们进行交换。本次操作后,a[0] 〜 a[n−2]中的最大元素“冒泡”到a[n−2]; …… 第i步:在剩下未排序的n−k个数(a[0]〜a[n−i])中,从a[0]起,依次比较相邻的两个数,若邻接元素不符合次序要求,则对它们进行交换。本次操作后,a[0] 〜 a[n−i]中的最大元素“冒泡”到a[n−i]; …… 第n−1步:在剩下未排序的2个数(a[0] 〜a[1])中,比较这两个数,若不符合次序要求,则对它们进行交换。本次操作后,a[0] 〜 a[1]中的最大元素“冒泡”到a[1]。


输入格式:


输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。


输出格式:


在每一行中输出排序过程中对应步骤的中间结果,即每一步后a[0]〜 a[n−1]的值,相邻数字间有一个空格,行末不得有多余空格。


输入样例:

输入:

5
8 7 6 0 1

输出:

7 6 0 1 8
6 0 1 7 8
0 1 6 7 8
0 1 6 7 8

代码:

#include<stdio.h>
int main()
{
  int a[10],i,j,n,k,temp,flag;
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {scanf("%d",&a[i]);}
  if(n==1)
    printf("%d",a[0]);
  for(i=n-1;i>=1;i--)
  {   flag=1;
    for(j=0;j<i;j++)
    {
      if(a[j]>a[j+1])
      {
      temp=a[j];
      a[j]=a[j+1];
      a[j+1]=temp;
      flag=0;
    }
    }
    for(k=0;k<n-1;k++)
    { printf("%d ",a[k]);
    }
    printf("%d\n",a[n-1]);
  }
  return 0;
}
相关文章
|
存储 算法 安全
【C语言程序设计——选择结构程序设计】按从小到大排序三个数(头歌实践教学平台习题)【合集】
本任务要求从键盘输入三个数,并按从小到大的顺序排序后输出。主要内容包括: - **任务描述**:实现三个数的排序并输出。 - **编程要求**:根据提示在编辑器中补充代码。 - **相关知识**: - 选择结构(if、if-else、switch) - 主要语句类型(条件语句) - 比较操作与交换操作 - **测试说明**:提供两组测试数据及预期输出。 - **通关代码**:完整代码示例。 - **测试结果**:展示测试通过的结果。 通过本任务,你将掌握基本的选择结构和排序算法的应用。祝你成功!
250 4
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
501 7
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
730 8
|
算法 C语言
【C语言】排序查找
【C语言】排序查找
114 2
|
算法 搜索推荐 C语言
【C语言】冒泡排序+优化版
【C语言】冒泡排序+优化版
179 1
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
210 0
|
NoSQL 算法 Redis
Redis的实现三:c语言实现平衡二叉树,通过平衡二叉树实现排序集
本博客介绍了如何在C语言中实现一个平衡二叉树,并通过这个数据结构来模拟Redis中的排序集功能。
141 0
|
5月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1156 0
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
777 23