C语言详解冒泡排序

  • 一、基本思想
  • 二、算法实现及优化
  • 三、代码清单

一、基本思想

冒泡排序是交换排序中最易理解也最经典的一个排序,其基本思想是从左向右依次比较相邻两个元素的大小,如果左边大于右边就交换,一趟排序后就可以让最大的值浮到最右侧。不断重复这个操作就可以让数组有序。

二、算法实现及优化

想要实现冒泡排序,我们首先写出一趟冒泡排序,很简单,从左向右依次比较即可,只要左边大于右边就发生交换

注意:
数组有n个元素,我们从数组的第1个元素开始比较,到数组的第n-1个元素结束,共比较了n-1次。例如下图,从第1个开始到第6个结束。一趟排序的代码就可以写出来:

     //1.第1趟排序,从第1个元素开始到n-1个元素结束,比较n-1次for (int j = 0; j < n-1; ++j){//如果左边大于右边,则交换位置if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);}}

这样一趟排序下来就可以把最大的数字冒到最右边了,如果我们重复这个操作n-1次就可以把次大的数,再次大的数都冒到最右边,一个循环搞定

void BubbleSort1(int* a, int n)
{//排n趟就可以让数组有序int end=n-1;while(end>0){//一趟排序,从第一个元素开始到n-1个元素结束,for(int j = 0; j<n-1; ++j){//如果左边大于右边,就交换if(a[j]>a[j+1]){Swap(&a[j],&a[j+1]);}}--end;PrintArr(a,n);}
}

这个代码虽然可以让数组有序,但却有冗余的排序,因为一趟排序后数组中的最大元素就可以确定位置,第二趟排序后次大元素的位置也被确定,因此我们可以继续优化代码

如图,第一趟从一个元素开始比较n-1次,56冒到最右边;
第二趟最后一个元素位置确定,只用比较n-2次即可,55冒到次右边;
……
第6趟只需要比较一次就可以让数组有序。
假设数组中有n个元素,则需要排n-1趟,每一趟用i表示,第i趟就需要比较n-i-1次,代码

void BubbleSort2(int* a, int n)
{//n-1趟排序for(int i = 0; i < n-1; ++i){//每一趟比较n-i-1次for(int j=0; j<n-i-1; ++j){if(a[j]>a[j+1]){Swap(&a[j],&a[j+1]);}}PrintArr(a,n);}
}


这个算法依然可以优化,假设数组在第i趟排序后就已经有序,那么后面就不要再比较了,这种优化更加简单,只需要定义一个flag,如果在一趟排序中flag没有发生变化,我们就可以认为这个数组已经有序,则退出循环。

void BubbleSort(int* a, int n)
{//n-1趟排序for(int i = 0; i < n-1; ++i){int flag = 0; //设置flag//每一趟比较n-i-1次for(int j=0; j<n-i-1; ++j){if(a[j]>a[j+1]){flag = 1; //如果该趟排序发生交换,flag置1Swap(&a[j],&a[j+1]);}}PrintArr(a,n);//一趟排序过后没有发生变化,说明数组已经有序if(flag == 0)break;}
}

三、代码清单

#include <stdio.h>void PrintArr(int* a, int n)
{for(int i = 0; i < n; ++i){printf("%d ",a[i]);}printf("\n");
}void Swap(int* px, int* py)
{int tmp = *px;*px = *py;*py = tmp;
}void BubbleSort1(int* a, int n)
{//排n趟就可以让数组有序int end=n-1;while(end>0){//一趟排序,从第一个元素开始到n-1个元素结束,for(int j = 0; j<n-1; ++j){//如果左边大于右边,就交换if(a[j]>a[j+1]){Swap(&a[j],&a[j+1]);}}--end;PrintArr(a,n);}
}void BubbleSort2(int* a, int n)
{//n-1趟排序for(int i = 0; i < n-1; ++i){//每一趟比较n-i-1次for(int j=0; j<n-i-1; ++j){if(a[j]>a[j+1]){Swap(&a[j],&a[j+1]);}}PrintArr(a,n);}
}void BubbleSort(int* a, int n)
{//n-1趟排序for(int i = 0; i < n-1; ++i){int flag = 0; //设置flag//每一趟比较n-i-1次for(int j=0; j<n-i-1; ++j){if(a[j]>a[j+1]){flag = 1; //如果该趟排序发生交换,flag置1Swap(&a[j],&a[j+1]);}}PrintArr(a,n);//一趟排序过后没有发生变化,说明数组已经有序if(flag == 0)break;}
}int main()
{int a[] = {25,6,56,24,9,12,55};int b[] = {25,6,56,24,9,12,55};int c[] = {25,6,56,24,9,12,55};int n = sizeof(a)/sizeof(a[0]);printf("-----BubbleSort------\n");BubbleSort(a,n);printf("-----BubbleSort1------\n");BubbleSort1(b,n);printf("-----BubbleSort2------\n");BubbleSort2(c,n);//PrintArr(a,n);return 0;
}

数据结构——冒泡排序(C语言)相关推荐

  1. 数据结构—冒泡排序 C语言代码实现(从前向后/从后向前两种)

    冒泡排序的思想就是交换,假设要使序列排为递增 如果从左到右比较,则如果左边的比较大就交换, 如果从右向左比较,则右边的比较小就交换. //冒泡排序-从左到右交换 void Bubblesort(int ...

  2. 资料分享:送你一本《数据结构(C#语言版)》电子书!

    对于信息类专业的学生而言,数据结构与算法是一门必修的课程.只有学好这门课程,熟练掌握线性表.栈.队列.树.图等基本结构,以及在这些结构上的各种算法,才能利用计算机去解决实际问题. 如何学好这门课程呢, ...

  3. 数据结构(C语言版) 第 八 章 排序 知识梳理 + 习题详解

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  4. 算法和数据结构(Java语言)

    算法和数据结构(Java语言) 持续更新中- 线性结构和非线性结构 线性结构 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序存储结构和链式 ...

  5. 算法和数据结构(golang语言实现)

    算法和数据结构(golang语言实现) 第1节 选择.冒泡.插入.复杂度 选择排序 选择排序 时间复杂度为O(N^2) 额外空间复杂度O(1) 过程: arr[0-N-1]范围上,找到最小值所在的位置 ...

  6. 资料分享:送你一本《数据结构(C语言版)》电子书!

    要想写出可复用.可扩展.易维护.灵活性好的代码,「数据结构」这一关必须要过啊! 在数据结构与算法的众多教材中,奉为经典的当属清华大学严蔚敏老师的著作.很多学校也选择这本书作为考研指定教材. 正在学习数 ...

  7. 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

    目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...

  8. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

    目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...

  9. 数据结构(C语言版) 第二章 线性表 知识梳理+作业习题详解

    目录 一.线性表顺序存储结构(顺序表) 0.线性表的基本概念 1.样例引入:多项式相加 二.线性表链式存储结构(链表) 0.链表的基本概念 1.前插法代码实例 2.链表尾插法完整代码附带各种操作 三. ...

最新文章

  1. Proactor设计模式
  2. 力扣【阶乘问题】leetcode-172、阶乘后的零;leetcode-793、阶乘后K个零;
  3. 修改linux的shell限制,Nginx下解决WebShell访问限制问题
  4. 春风吹用计算机的谱子,方大同《春风吹》简谱
  5. 靶场练习第十二天~vulnhub靶场之dc-4
  6. python中各种@property、@xxx.setter、@classmethod、@staticmethod 都是些啥啊?
  7. APT***实例研究与企业现有防御体系缺陷分析
  8. 图论基础(Tarjan与拓扑排序)
  9. binder机制原理android,Binder机制1---Binder原理介绍
  10. C# 实现Windows Media Encoder音视频捕捉
  11. 一种串口扩展电路应用
  12. TCPIP卷一(11):EIGRP的汇总、stub、leak-map参数
  13. thingworx- 安装thingworx120天试用版步骤
  14. Maven-POM.xml
  15. CC2640R2F BLE5.0 蓝牙协议栈GATTServApp模块
  16. CFML----一门在国外很多大公司得到应用的语言
  17. 2023年江苏省赛事网络空间安全理论题库
  18. python问题解决----把\xe6\xa8\xa1\这种字符转为普通汉字?
  19. k8s之StorageClass(NFS)
  20. 针对秒杀项目做的一些优化

热门文章

  1. php xmp,在jpeg中编写XMP元数据(使用PHP) – 使用单个或多个rdf:描述块
  2. HTML5+JavaScript实现进度条效果
  3. 一篇解释清楚Cookie是什么?
  4. 专访百度资深工程师孙源:代码强迫症的死实践派
  5. Redis--变慢的原因及排查方法--系统方面
  6. 【windows8开发】开发平台与开发框架
  7. 安卓进度条自动增加从1到100完整代码
  8. 使用Python读取文件夹中的图片
  9. 加入域提示“不能访问网路位置” 的解决方法
  10. cocos creator中FBX文件不可用显示asset invalid