微信公众号:小白算法
关注可了解更多算法,并能领取免费资料。问题或建议,请公众号留言;
小白算法,简单白话算法,每个人都能看懂的算法

序言

排序,顾名思义就是排列使得有序呗!!!通常意义上,我们所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。

排序算法大体可分为两种:

一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等;
另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。

一:冒泡排序(BubbleSort)

何为冒泡?看下下面这条鱼吐泡泡的样子,泡泡会从底端逐渐的浮上水面,由于水压的原因,会逐渐的变大,然后炸裂,这个算法的名字就是这么形象的理解的。冒泡排序名字的由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端

冒泡排序算法的步骤:

从小到大进行排序:
1 比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置;
2 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数
3 针对所有的元素重复以上的步骤,除了最后一个;
4 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

举例,采用冒泡排序实现对序列{ 6, 5, 3, 1, 8, 7, 2, 4 }排序的实现过程如下

#include <stdio.h>// 分类 -------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- O(n^2)
// 最优时间复杂度 ---- 如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,可以把最优时间复杂度降低到O(n)
// 平均时间复杂度 ---- O(n^2)
// 所需辅助空间 ------ O(1)
// 稳定性 ------------ 稳定void Swap(int A[], int i, int j)
{int temp = A[i];A[i] = A[j];A[j] = temp;
}void BubbleSort(int A[], int n)
{for (int j = 0; j < n - 1; j++)         // 每次最大元素就像气泡一样"浮"到数组的最后{for (int i = 0; i < n - 1 - j; i++) // 依次比较相邻的两个元素,使较大的那个向后移{if (A[i] > A[i + 1])            // 如果条件改成A[i] >= A[i + 1],则变为不稳定的排序算法{Swap(A, i, i + 1);}}}
}int main()
{int A[] = { 6, 5, 3, 1, 8, 7, 2, 4 };    // 从小到大冒泡排序int n = sizeof(A) / sizeof(int);BubbleSort(A, n);printf("冒泡排序结果:");for (int i = 0; i < n; i++){printf("%d ", A[i]);}printf("\n");return 0;
}

上述代码的动画实现过程如下:

优点:冒泡排序是最容易了解和实现的排序算法之一。

缺点:对于少数元素之外的数列排序是效率低。

最后说一下冒泡排序的时间复杂度问题:

>最佳排序若文件的**初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:Cmin=n-1,Mmin=0。初始排序就是最终需要的序列,其是冒泡排序的最好情况,时间复杂度为0(n)。
最差排序:最佳排序的文件的初始状态是正序的,那若初始文件是反序的,需要进行n-1趟排序,每趟排序要进行n-i(1<=i=<n-1)次的比较,且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值O(n平方):

冒泡排序的改进:鸡尾酒排序

鸡尾酒排序,也叫定向冒泡排,是冒泡排序的一种改进。此算法与冒泡排序的不同处在于**从低到高**,然后**从高到低**,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能。(PS:何为鸡尾酒排序,鸡尾酒都知道是将各种酒混合在一起,伏特加倒入威士忌酒杯里,**先下降,再上升**)

#include <stdio.h>
// 分类 -------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- O(n^2)
// 最优时间复杂度 ---- 如果序列在一开始已经大部分排序过的话,会接近O(n)
// 平均时间复杂度 ---- O(n^2)
// 所需辅助空间 ------ O(1)
// 稳定性 ------------ 稳定void Swap(int A[], int i, int j)
{int temp = A[i];A[i] = A[j];A[j] = temp;
}void CocktailSort(int A[], int n)
{int left = 0;           // 初始化左起点int right = n - 1;      // 初始化右起点while (left < right){//从左往右开始for (int i = left; i < right; i++)   // 前半轮,将最大元素放到后面{if (A[i] > A[i + 1]){Swap(A, i, i + 1);}}right--;//从右往左开始for (int i = right; i > left; i--)   // 后半轮,将最小元素放到前面{if (A[i - 1] > A[i]){Swap(A, i - 1, i);}}left++;}
}int main()
{int A[] = { 6, 5, 3, 1, 8, 7, 2, 4 };   // 从小到大定向冒泡排序int n = sizeof(A) / sizeof(int);CocktailSort(A, n);printf("鸡尾酒排序结果:");for (int i = 0; i < n; i++){printf("%d ", A[i]);}printf("\n");return 0;
}

思考

为什么鸡尾酒排序比冒泡排序稍微好一点呢?

举个栗子
以序列(2,3,4,5,1)为例,采用升序排列。**冒泡排序需要从左到右依次将2,3,4,5往后移动,将1往前移动;但是,鸡尾酒排序从左到右一趟,没一个变化的,然后从右向左,把1直接移动到第一位,就ok了。

参考资料:http://www.cnblogs.com/eniac12/p/5329396.html

下期预告:小白带你学---排序算法1的冒泡排序的内容理解到了吗?下期继续更新选择排序
该系列持续更新中,想get更多有趣的算法知识,或者提出宝贵意见,请关注微信公众号“小白算法”并联系我们,回复219,还可以免费获取著名机器学习教材《机器学习-周志华》一书,谢谢!!!

小白带你学---排序算法1相关推荐

  1. 人工智能实现a*算法解决八数码_小白带你学回溯算法

    微信公众号:小白算法 关注可了解更多算法,并能领取免费资料.问题或建议,请公众号留言;小白算法,简单白话算法,每个人都能看懂的算法 上一期算法回顾--贪婪法:https://mp.weixin.qq. ...

  2. 【轻松学排序算法】眼睛直观感受几种常用排序算法(转)

    1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通 ...

  3. 小白带你学安卓——初识android

    作为一名大三的学生,之前简单地接触过android,但不是特别深入,随着时间的推移,发现自己也对android很感兴趣.之前也看过很多大牛们在这里写博客,昨天自己突发奇想,将自己的知识点以博客的形式进 ...

  4. 小白带你学安卓——Intent

    对于Intent来说,我们之前也简单的接触到一些.它的作用也十分的明显,用于传递一些数据:其实,它还有另一个用途,描述你想要干的事情,是Android四大组件(Activity,Service,Bro ...

  5. 八种经典排序算法总结

    前言 算法和数据结构是一个程序员的内功,所以经常在一些笔试中都会要求手写一些简单的排序算法,以此考验面试者的编程水平.下面我就简单介绍八种常见的排序算法,一起学习一下. 一.冒泡排序 思路: 比较相邻 ...

  6. 排序算法 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数

    文章目录 写在前面 排序 1. 基数排序`稳定` 2. 归并排序`稳定`merge sort 3. 快速排序`不稳定`quick sort 4. 堆排序`不稳定`heap sort 大根堆 小根堆 5 ...

  7. 【数据结构基础应用】【查找和排序算法】

    代码参考<妙趣横生的算法.C语言实现> 文章目录 前言 1.顺序查找 2.折半查找 3.直接插入排序 4.选择排序 5.冒泡排序 6.希尔排序 7.快速排序 8.堆排序 9.排序算法性能比 ...

  8. c++ sort 从大到小排序_C语言必学的12个排序算法:堆排序(第7篇)

    题外话堆排序比之前的简单选择.冒泡算法.快速排序算法复杂一些,因为用到了树形数据结构,但是本文使用了数组实现完全二叉树,因此也比较简单.C语言初学者,可以简单了解其思想,具体的知识掌握可以参照数据结构 ...

  9. 漫画 | 程序媛小姐姐带你一次了解什么是排序算法

    来源 | 小齐本齐 封图 | CSDN 付费下载自视觉中国 插入排序 借用<算法导论>里的例子,就是我们打牌的时候,每新拿一张牌都会把它按顺序插入,这,其实就是插入排序. 齐姐声明:虽然我 ...

最新文章

  1. Binwalk固件分析利器
  2. centos7执行sh文件_一文看懂centos7如何管理自定义脚本服务
  3. php act index漏洞,浅析PHP程序中的目录遍历漏洞
  4. wxWidgets:绘制自定义控件
  5. jqury ajax跳转界面,jquery ajax 界面跳转失败解决方案
  6. Linux+.NetCore+Nginx搭建集群
  7. ArcGIS GeoDataBase GeoDataset dataset
  8. HttpServletRequest对象
  9. python3函数重载_9.20 利用函数注解实现方法重载
  10. python输出csv中的双引号
  11. 如果你这样回答“线程安全”,面试官都会对你刮目相看
  12. ubuntu使用命令设置静态IP地址
  13. 深入理解Flash的沙箱 – Application Domains
  14. QRCode.js:使用 JavaScript 生成二维码
  15. B站视频直接下载成mp4格式
  16. 如何查看手机登录IP地址
  17. scrapy 简单教程
  18. 【akka】初识Akka 简单介绍
  19. win XP实现自动登陆
  20. JS逆向必会基础案例 | 百度翻译参数破解

热门文章

  1. 什么是最牛逼的代码?
  2. 霍常亮教你开发淘宝客app第11节:uniapp数据绑定
  3. 沙发后面墙挂什么画 你需要一幅像样的装饰画
  4. SpringBoot项目No qualifying bean of type ‘×××Mapper‘ available:的错误解决
  5. 如何让爬虫工具不自动过滤重复数据
  6. 成本中心主数据维护及其导致常见报错解析(如:消息号 KI261 成本中心 / 冻结而不能直接对 收入记帐)
  7. 调用支付宝第三方接口(沙箱环境) Spring Boot+Maven
  8. 不同程序用不同网络_Python3.9版本发布,不同领域程序员应该怎样学Python?
  9. 亚信电子最新AxRobot EtherCAT七轴助力控制机器手臂解决方案
  10. 微信8.0.18版来了