【编程学习】算法之排序小结

原创 2016年05月31日 21:57:34

上一篇文章总结了一下算法,顺便还说了说为什么要学算法和算法的一些基本特征,这篇文章就来总结一下我目前所了解的排序算法。

首先,国际惯例:

一、什么是排序算法?

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。

二、排序算法都包括什么内容?

1、分类:(1)稳定的:

冒泡排序(bubble sort) — O(n^2)
鸡尾酒排序(Cocktail sort,双向的冒泡排序) — O(n^2)
插入排序(insertion sort)— O(n^2)
桶排序(bucket sort)— O(n); 需要 O(k) 额外空间
计数排序(counting sort) — O(n+k); 需要 O(n+k) 额外空间
合并排序(merge sort)— O(nlog n); 需要 O(n) 额外空间
原地合并排序— O(n^2)
二叉排序树排序 (Binary tree sort) — O(nlog n)期望时间; O(n^2)最坏时间; 需要 O(n) 额外空间
鸽巢排序(Pigeonhole sort) — O(n+k); 需要 O(k) 额外空间
基数排序(radix sort)— O(n·k); 需要 O(n) 额外空间
Gnome 排序— O(n^2)
图书馆排序— O(nlog n) with high probability,需要 (1+ε)n额外空间

(2)不稳定的:

选择排序(selection sort)— O(n^2)
希尔排序(shell sort)— O(nlog n) 如果使用最佳的现在版本
组合排序— O(nlog n)
堆排序(heapsort)— O(nlog n)
平滑排序— O(nlog n)
快速排序(quicksort)— O(nlog n) 期望时间,O(n^2) 最坏情况; 对于大的、乱数列表一般相信是最快的已知排序
Introsort— O(nlog n)
Patience sorting— O(nlog n+ k) 最坏情况时间,需要 额外的 O(n+ k) 空间,也需要找到最长的递增子串行(longest increasing subsequence)

(3)不实用的:

Bogo排序— O(n× n!) 期望时间,无穷的最坏情况。
Stupid sort— O(n^3); 递归版本需要 O(n^2) 额外存储器
珠排序(Bead sort) — O(n) or O(√n),但需要特别的硬件
Pancake sorting— O(n),但需要特别的硬件
stooge sort——O(n^2.7)很漂亮但是很耗时

2、常见的排序算法:

插入排序
插入排序是这样实现的:
1、首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。
2、从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。
3、重复2号步骤,直至原数列为空。
插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。
插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过程中逐个将比较过的元素往后移一位,为元素 x “腾位置”,最后将 k 对应的元素值赋为 x ,一般情况下,插入排序的时间复杂度和空间复杂度分别为 O(n2 ) 和 O(1)。[1] 
冒泡排序
冒泡排序是这样实现的:
1、从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
2、重复1号步骤,直至再也不能交换。
冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但冒泡排序是原地排序的,也就是说它不需要额外的存储空间。
选择排序
选择排序是这样实现的:
1、设数组内存放了n个待排数字,数组下标从1开始,到n结束。
2、初始化i=1
3、从数组的第i个元素开始到第n个元素,寻找最小的元素。
4、将上一步找到的最小元素和第i位元素交换。
5、i++,直到i=n-1算法结束,否则回到第3步
选择排序的平均时间复杂度也是O(n^2)的。
举例:
564
比如说这个,我想让它从小到大排序,怎么做呢?
第一步:从第一位开始找最小的元素,564中4最小,与第一位交换。结果为465
第二步:从第二位开始找最小的元素,465中5最小,与第二位交换。结果为456
第三步:i=2,n=3,此时i=n-1,算法结束
完成
快速排序
现在开始,我们要接触高效排序算法了。实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。
时间复杂度
平均时间复杂度
插入排序 O(n^2)
冒泡排序 O(n^2)
选择排序 O(n^2)
快速排序 O(n log n)
堆排序 O(n log n)
归并排序 O(n log n)
基数排序 O(n)
希尔排序 O(n^1.25)

三、

版权声明:本文为博主原创文章,未经博主允许不得转载。

学习编程一年半心得体会

本人专业不是专攻计算机软件方面的 但是由于软件方向接触的比较早所以就开始了学习编程的道路 记得当时是因为我们专业软件实验室招手新生 自己其实当时这个一点也不了解 看到大家都在刷题 自己也跟着刷 后面就...
  • Her_smile
  • Her_smile
  • 2018年02月01日 17:45
  • 112

学习排序算法简介

学习排序算法简介 学习排序(Learning to Rank, LTR)是一类基于机器学习方法的排序算法。 传统经典的模型,例如基于TFIDF特征的VSM模型,很难融入多种...
  • puqutogether
  • puqutogether
  • 2014年12月24日 09:35
  • 2292

计算机学习总结

计算机学习计划总结从10年6月开始,主要完成的计算机学习计划有: 算法与数据结构 面对对象设计语言及进阶 Java C++入门 *操作系统 编译原理 其他计算机本科课程 算法与数据结构 主要通过公...
  • tony2909
  • tony2909
  • 2015年05月20日 21:01
  • 180

数据结构与算法之八大排序

排序是编程的基础,在程序中会经常使用,好的排序方法可以帮助你提高程序运行的效率,所以学好排序,打好基础,对于程序的优化会手到擒来。无论你的技术多么强,如果没有基础也强不到哪去。        不...
  • jia_xu_
  • jia_xu_
  • 2017年10月06日 17:14
  • 162

ruiaijun人工智能理论纪录片:《反射算法与离散智能编程》《自编程自主学习算法》

该纪录片讲述了人工智能研究者ruiaijun以一种全新的方式分析人类智能活动,并提出了一套完全不依赖连续数学、不构建人工神经网络就能模拟智能的理论。 纪录片里介绍了ruiaijun模拟智能的两大理论—...
  • UniverseAI
  • UniverseAI
  • 2016年02月14日 15:37
  • 1237

主动排序学习算法之PRank

PRank算法摘自梁斌博客         PRank是一个pointwise的监督学习排序的方法,一般被用作baseline。我看了下论文,然后动手写了个小实验,进行了理解。 ...
  • piaoxuefengqi
  • piaoxuefengqi
  • 2013年12月25日 10:15
  • 2068

近一个月的工作学习总结

清明节3天的假期
  • acm365
  • acm365
  • 2014年04月07日 18:18
  • 2073

16年寒假学习小结

寒假学习小结
  • qq_34911465
  • qq_34911465
  • 2017年02月27日 21:46
  • 128

学习编程道路上的书籍之Python篇

学习编程专栏连载编程学习编程道路上的入门书籍之Python篇,文章中的所有推荐的书籍均来自知乎社区大牛力荐书籍、豆瓣评分较高书籍、各语言社区比较热门书籍以及京东、亚马逊、当当热销书籍的重合书籍。...
  • Ly4wU5giY
  • Ly4wU5giY
  • 2016年10月29日 19:16
  • 52

windows程序设计学习笔记--动态链接库

动态链接库是包含许多函数的独立文件,这些函数可以被应用程序和其他DLL调用以完成某些特定的工作。 一个动态链接库只有在另一个模块调用其包含的函数时,才被启动。动态链接:程序运行时,把模块中函数调用链...
  • x13262608581
  • x13262608581
  • 2016年07月24日 10:29
  • 392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【编程学习】算法之排序小结
举报原因:
原因补充:

(最多只允许输入30个字)