冒泡排序

  • 一.单项冒泡排序
    • 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. 深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手
  2. PowerCLI脚本,利用哈希表对参数进行转换
  3. 如何用 React Native 创建一个iOS APP?(二)
  4. 北京内推 | 京东AI研究院计算机视觉实验室招聘三维视觉算法研究型实习生
  5. 生命周期共有那几个阶段_用产品生命周期 6 个阶段来思考
  6. html:(17):img标签和表单标签
  7. jQuery使用():Deferred有状态的回调列表(含源码)
  8. Graphics 单元中的类
  9. 高通平台Bring-up
  10. libgmailer更新了,俺的下载空间又可以使用了(使用G-Share)
  11. 网络通信基础——网络协议
  12. android App下载与安装
  13. 第一次学游泳技巧_第一次学游泳小学生作文(精选5篇)
  14. 中国数学界为之骄傲--庞加莱猜想的完美证明
  15. MacBook关闭系统更新
  16. steps_per_epoch=2000,epochs=100之间的区别
  17. 2021苹果CMSV10完美对接萝卜影视(原生)蓝色版
  18. 导师的SCI很少一作和通讯是怎么回事?
  19. linux卡利系统设置密码,Windows 10 Windows Linux子系统安装指南-官网
  20. 卡特兰数列(Catalan)

热门文章

  1. Java类的初始化、变量的初始化
  2. 按字母A——Z排列的中国城市(地级市)json数据
  3. Sharding:分表、分库、分片和分区
  4. cqyz oj | 单峰排列
  5. 多功能乐谱编写:Steinberg Dorico for Mac
  6. 笨办法学python在线阅读_笨办法学python全集.pdf
  7. 笨办法学Python3 习题39和习题40
  8. 前端开发:项目运行npm install 提示XXX packages are looking for funding run `npm fund` for details的解决方法
  9. java作业斗地主实现
  10. 如何利用 GitHub 从零开始搭建一个博客