C语言冒泡排序的理解与使用(刚入门编程也能轻松看懂)

简介: C语言冒泡排序的理解与使用(刚入门编程也能轻松看懂)

话不多说,我们直接开始写代码。


#include<stdio.h>
int main()
{
  int i,j;
  int arr[] = {20,-2,1314,5,-5,9999,0}; 
  int sz = sizeof(arr) / sizeof(arr[0]);//获取数组的长度
  //数组排序前,遍历数组
  for(i = 0;i < sz;i++)
  {
  printf(" %d ",arr[i]);
  }
  //使用冒泡排序将数组中的元素从小到达依次排列 
  for(i = 0;i < sz;i++)
  {
  for(j = 0;j < sz - i -1;j++)
  {
    if(arr[j] > arr[j + 1])
    {
    int temp = arr[j];
    arr[j] = arr[j+1];
    arr[j+1] = temp;
    }
  }
  }
  //数组排序后,遍历数组 
  printf("\n");
  for(i = 0;i < sz;i++)
  {
  printf(" %d ",arr[i]);
  } 
  return 0;
}


①首先,我们定义了一个无序的整形数组arr


②我们使用了sizeof函数获取arr数组的长度//显而易见这里的数组长度为7,即sz的值为7


③使用for循环对数组遍历


④使用冒泡排序对arr数组进行操作


理解:我们在这里首先使用第一个for循环(即外层循环)是比较的轮数,数组内有7个数,那么就应该比较7-1=6轮,第二个for循环(即内层循环)比较的是当前这一轮的比较次数,例如:第一轮比较7-1=6次,第二轮比较7-2=5次,但是由于外层循环每循环一次就会将数组中的最大值放到数组的最后一个位置,所以外层循环每循环一次,内层循环可以少循环一次,所以控制第二层循环的循环条件应该是一个变量,可以用(j < sz - i - 1)表示。


我们一步步来看一下这个冒泡排序的具体过程(以此示例数组为例)


20  -2  1314  5  -5  9999  0 这是数组的默认无序的排列


进入第一次外层循环:i = 0


          进入内层循环:j = 0  j < sz - i - 1(j < 6) 进入if语句  if(arr[0]>arr[1])  即20 > -2 ? 结果为真,             所以我们定义了一个临时变量,将20与-2调换位置,此时arr[0] = -2,arr[1] = 20。语句结束               后,j++,j = 1,j <  sz - i - 1(j < 6),内层循环的第 一次循环结束,进入内层循环的第二次循             环,进入if语句 if(arr[1]>arr[2])  即20 > 1314 ? 结果为假,不执行if语句中的交换语句j++,j             = 2, j <  sz - i - 1(j < 6),内层循环的第二次循环结束,进入内层循环的第三次循环,进                 入if语句 if(arr[2]>arr[3])  即1314> 5 ? 结果为真,将1314与5调换位置,此时arr[2] =5,                   arr[3] = 1314。.................依次类推,当内层循环的执行最后一次循环当j = 5时,j <  sz - i -             1(j < 6),进入if语句 if(arr[5]>arr[6])  即9999> 0 ? 结果为真,将9999与0调换位置,此时            arr[5] =0,arr[6] = 9999。j++,j = 6,j <  sz - i - 1(j < 6),不满足循环条件,退出内层循环


          i++,i = 1,i < sz(i < 7)


进入第二次外层循环:


          由第一次的外层循环易知,每完成一次外层循环,都会将数组中的最大值放到数组的最后,


          所以每一次外层循环结束后,再次进入只需要将前sz-1-i个数组元素进行两两比较,判断是             否需要交换位置(即这个数组长度为7的数组结束第一次外层循环之后,元素9999,即数组               最大值已经交换到了数组的最后,当进入第二次外层循环只需要对前6个元素进行操作,找             到这前六个元素的最大值并将其放在数组的倒数第二个位置,所以第二次外层循环较第一               次外层的循环的内层循环要少一次,以此类推就可理解第二次for循环的循环条件 j < sz-i-1)



..............


冒泡排序的大概框架就是这样,初学者其实只要多看几遍多写几次就很好理解啦~~


最后分享一张冒泡排序的动态示意图吧,便于大家加强对冒泡循环的理解~~      


8ee1d3e7ca232f5f5c98af623d87c03f_b2576523e047dd87e7734fc757f4a519.gif


目录
相关文章
|
3月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
75 2
|
1月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
86 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
1月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
47 8
|
2月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
78 4
|
3月前
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
542 12
|
3月前
|
算法 搜索推荐 C语言
【C语言】冒泡排序+优化版
【C语言】冒泡排序+优化版
|
3月前
|
存储 Java 编译器
初识C语言1——C语言入门介绍
初识C语言1——C语言入门介绍
42 1
|
3月前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
39 0
|
3月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
4月前
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。