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;
}
相关文章
|
15天前
|
存储 C语言
Leetcode—— 删除排序数组中的重复项——C语言
Leetcode—— 删除排序数组中的重复项——C语言
|
17天前
|
编译器 C语言
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
27 1
|
1天前
|
搜索推荐 前端开发 C语言
C语言探索:冒泡排序的实现与解读
C语言探索:冒泡排序的实现与解读
|
8天前
|
算法 搜索推荐 数据处理
C语言中的排序与查找技术详解
C语言中的排序与查找技术详解
17 1
|
9天前
|
算法 C语言 C++
C语言进阶:冒泡排序函数初步实现
C语言进阶:冒泡排序函数初步实现
|
14天前
|
存储 搜索推荐 算法
C语言数据结构算法,常用10种排序实战
插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 冒泡排序(Bubble Sort) 归并排序(Merge Sort) 快速排序(Quick Sort) 堆排序(Heap Sort) 基数排序(Radix Sort)
12 1
C语言数据结构算法,常用10种排序实战
|
17天前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(下)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
21 1
|
17天前
|
存储 C语言
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)(上)
C语言初阶④(数组)知识点+编程作业(三子棋,冒泡排序)
23 0
|
23小时前
|
C语言 C++
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
C语言学习记录——内存函数(memcpy、memmove、memcmp、memset、模拟实现memcpy、模拟实现memmove)
9 3
|
23小时前
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
8 1