冒泡排序

  • 一.单项冒泡排序
    • 1.算法思路
    • 2.循环流程
    • 3.伪代码实现
  • 二.双向冒泡排序
    • 1.双向冒泡排序的概念
    • 2.双向冒泡排序流程
    • 3.双向冒泡排序伪代码
  • 三.总结

一.单项冒泡排序

单向冒泡排序从左到右遍历列表,比较每对相邻的元素,如果它们的顺序不正确,则交换它们。在第一轮迭代之后,最大的元素就会被放置在列表的最后面。然后,算法继续进行下一轮迭代,但这次只需要比较和交换前n-1个元素,因为列表的最后一个元素已经确定了。如此反复进行,直到所有元素都被排好序。
它的时间复杂度为O(n^2)

创建一个数组(这里的单向冒泡排序我利用哨兵的写法讲解)

进行排序
像这种冒泡排序是通过比较数组相邻元素的值进行比较然后交换元素的位置从而达到排序的效果,所以我们会多次使用的交换这个操作,我们此处可以实例化一个swap函数用来交换,但是一定要记住用指针的形式传参,这样才可以在另一个函数里面改变冒泡排序里面面要改变的元素

void swap(int* x, int* y)
{int temp = *x;*x = *y;*y = temp;
}

1.算法思路

先将整个数组从第二个元素开始遍历,然后第二层循环就是让外层数组的每一个元素跟内层循环遍历的元素一一进行比较,然后根据条件进行交换从而达到排序的效果

2.循环流程

第一趟循环
就是让38和49比较,这里38小于49所以进行交换操作得到下面数组

第二趟循环
本次循环时65和49比较,这里65大于49,符合我们升序的标准,自然这里不会进入交换的函数,直接进入下一趟循环

3.伪代码实现

void bubble_sort(int arr[], int sz)
{for (int i = 2; i < sz; i++){for (int j = 2; j < sz; j++){if (arr[j-1] > arr[j]){arr[0] = arr[j-1];arr[j-1] = arr[j];arr[j] = arr[0];}}}
}

其他循环也是以此类推
最终运行结果

二.双向冒泡排序

1.双向冒泡排序的概念

双向冒泡排序(也称为鸡尾酒排序或定向冒泡排序)是一种变体的冒泡排序算法。该算法从列表的两端开始分别进行冒泡排序,每次将最大值和最小值分别放置在列表的两端。这样可以减少排序的总轮数,但并不能优化排序的时间复杂度,仍然为O(n^2)。

2.双向冒泡排序流程

创建好一个数组,定义两个变量来控制排序的终止
从下图可以可看出,当shift_l和shift_r相交时表示排序完成
所以我们不难知道外层循环判断的条件就是shift_l<shift_r


第一躺排序
从左边开始排序
让38和49进行比较,38小于49,两个元素进行交换
跳出循环,让shift_r-1,为了后面的右侧循环让它用倒数第二个元素和倒数第一个元素比较

第二趟循环,右侧循环,让27和49进行比较,27小于49,两个元素符合升序的标准,不需要进行交换.

让shift_l+1,让它进行下一趟的单项循环
其他循环也是和上述一样的操作,直到shift_l和shift_r相交,说明排序完成.

3.双向冒泡排序伪代码

void swap(int* x, int* y)
{int temp = *x;*x = *y;*y = temp;
}
//双向冒泡排序
void doublebubble_sort(int arr2[], int sz)
{int i = 0;int shift_l = 0;int shift_r = sz - 1;while (shift_l < shift_r){for (i=shift_l; i < shift_r; i++){if (arr2[i] > arr2[i+1]){swap(&arr2[i], &arr2[i+1]);}}shift_r--;//让右侧排序从倒数第二个开始与它右侧元素比较for (i = shift_r;i> shift_l; i--){if (arr2[i] < arr2[i-1]){swap(&arr2[i], &arr2[i-1]);}}shift_l++; }
}

三.总结

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数组,比较每对相邻的元素,并按照顺序交换它们的位置,直到没有任何一对元素需要交换为止。冒泡排序的时间复杂度为O(n^2),其中n为要排序的元素个数。虽然冒泡排序的效率不是很高,但是它的实现简单易懂,适合排序元素个数较少的数组,适用场景与我上期的希尔排序恰恰相反,如果对希尔排序有疑问,请看我上期希尔排序.
希尔排序链接:http://t.csdn.cn/6BGXf

C语言数据结构+冒泡排序的实现相关推荐

  1. c语言选择冒泡排序,c语言选择冒泡排序讲解(附代码)

    c语言选择冒泡排序讲解(附代码) c语言选择冒泡排序讲解(附代码) 冒泡排序原理举例: 给定一组数 15 20 1 16 进行从大到小冒泡排序.第一次起泡的第一次比较:用15和20比较,若15比20小 ...

  2. Go语言-数据结构与算法

    go语言之专业数据结构与算法 3.golang实现数组结构 code\ArrayList\ArrayList.go package ArrayListimport ("errors" ...

  3. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...

  4. 数据结构c语言版第一章答案,《c语言数据结构》第一章概论自测题答案

    <<c语言数据结构>第一章概论自测题答案>由会员分享,可在线阅读,更多相关<<c语言数据结构>第一章概论自测题答案(4页珍藏版)>请在人人文库网上搜索. ...

  5. 一些可运行的C语言数据结构代码

    网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...

  6. C语言数据结构学习用单元测试

    药物名称: C语言数据结构学习用单元测试 主治: 本品是基于CUnit编写的.全部的.纯C的数据结构(ADT)各种实现的单元测试.主治基础不牢,水品增长缓慢.建议配合严蔚敏<数据结构>(C ...

  7. 数据结构----冒泡排序

    数据结构----冒泡排序 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> void bubbleSort(int a[ ...

  8. 顺序表输入栈元素c语言,C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍 ...

  9. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

最新文章

  1. c++ int转unsigned int_mysql中int、bigint、smallint 和 tinyint的区别详细介绍
  2. Proteus原理图元器件库详细说明
  3. Struts2技术详解
  4. HTMLCSS 第二天 笔记
  5. php_curl模拟登录有验证码实例
  6. windows7安装中注入USB3.0和NVME驱动
  7. 尚学堂浪曦视频学习推荐顺序
  8. 笔记本计算机故障与诊断,笔记本电脑维护与故障诊断
  9. 在线作图|2分钟在线绘制三维PCOA图
  10. html新年礼物,特别的新年礼物 特殊的新年礼物
  11. 顺丰控股亏损:或时效件面临见顶危机,或下沉市场厮杀,或为220亿定增设局?
  12. 电脑没有鼠标怎么打开计算机,电脑鼠标右键菜单没有打开方式选项怎么办
  13. DSP学习总结——Boot引导模式
  14. 火焰传感器+蜂鸣器 实现温度报警
  15. 李炎恢ECMAScript6 / ES6+(一)
  16. video.js播放rtmp直播源和hls直播源
  17. 中国科技大学网络视频课程软件设计模式(自主模式)
  18. Metasploit 渗透测试01-背景和功能介绍
  19. Cesium中加载Geojson
  20. java中定义常量必须使用的关键字是_可以单独使用final关键字在Java中定义常量吗?...

热门文章

  1. win10远程桌面多用户登录
  2. itchat 实现微信智能机器人
  3. C语言已知二进制码求循环码,二进制和循环码转换
  4. java波斯王子时之沙_我的世界Java版21w07a版本更新内容详情
  5. 498.Diagonal Traverse-M
  6. ClickHouse 函数
  7. 明细报表汇总使用说明
  8. android so调用java,AndServer+Service打造Android服务器实现so文件调用
  9. Robomongo 的安装
  10. 数字手势识别App--(2)图像处理