关闭

排序算法重要知识点

标签: 排序算法归并排序希尔排序快速排序
494人阅读 评论(0) 收藏 举报
分类:

经典排序算法及特性:

这里写图片描述

经典排序算法的空间复杂度:
O(1):冒泡、选择、插入、堆、希尔排序
O(logN)~O(N):快速排序
O(N):归并排序
O(M):计数排序、基数排序

经典排序算法的稳定性:
  稳定性概念:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

稳定的排序:冒泡、插入、归并、计数、基数、桶排序
不稳定的排序:选择、快排、堆、希尔排序

一、时间复杂度为O(N^2)的算法有:冒泡排序、选择排序、插入排序;

1.冒泡排序:
  第一个数与第二个数比较,大的放后面;第二个数与第三个数,第三个数与第四个数……依次比较,这样一来最大数放在最后。前n-1个数重复上述过程即可得到有序数组。

这里写图片描述

2.选择排序:
  在n个数中选出最小的数放在第一个位置,剩下n-1个数选出最小的数放在第二个位置,依次排序。
  或者,找出最大的一个元素,和末尾的元素交换,然后再从头开始,查找第1个到第N-1个元素中最大的一个,和第N-1个元素交换……其实差不多就是冒泡法的思想,但整个过程中需要移动的元素比冒泡法要少,因此性能是比冒泡法优秀的

3.插入排序

http://pic002.cnblogs.com/img/yc_sunniwell/201006/2010062815150025.png

二、时间复杂度为O(nlogn)的算法有:归并排序、快速排序、堆排序、希尔排序;

1.归并排序:  
  第一个数和第二个数,第三个数和第四个数……两两归并、排序,再把相邻的有序区间合并、排序,依次重复进行。

2.快速排序:
  随机选择一个数(例如最后一个数),比它小的放左边,比它大的放右边,左右两部分分别递归排序。

这里写图片描述

3.堆排序

这里写图片描述

  首先建立大小为n的大根堆,堆顶元素(即最大值)与最后一个元素交换,将其脱离大根堆存入有序数组;剩下部分进行大根堆调整后依次拿出堆顶最大值,存入有序数组即可。

4.希尔排序
希尔排序(Shell Sort)是插入排序的一种改良排序算法。关键在于步长的选择。
如图选择步长为4的数比较->步长为3比较->步长为2比较->最终步长为1比较结束。

这里写图片描述

三、时间复杂度为O(n)的算法有:计数排序、基数排序;

不是基于比较的排序算法,思想来自于桶排序。

1.计数排序

将各元素放入排好序的桶中,拿出后即排好序。

2.基数排序

这里写图片描述

先按个位数放入桶中排序,拿出序列;再分别按十位、百位放入桶中排序

1
0
查看评论

MFC深入浅出知识点笔记

第一章 1 windows程序可调用的函数库,包括windowsAPI和CRT(c runtime library)两部分组成 2 LIBC.LIB是静态版本。MSVCRT.LIB是C runtime函数库动态链接版本,如果链接此库,运行时必须有MSVCRT40在场。 3 Windows API主要...
  • guohanma
  • guohanma
  • 2017-04-20 15:42
  • 326

JAVA重要知识点

JAVA虚拟机:执行java字节码的虚拟机进程(java虚拟机知道底层硬件平台的指令长度和其它特性,使得java程序运行在任意平台成为可能)指令javac与java: javac:编译 java:运行JDK与JRE: JDK:java开发工具包与运行环境(包含JRE、编译器和其他工具:如Jav...
  • qq_15437629
  • qq_15437629
  • 2015-11-20 11:02
  • 676

C/C++重要知识点汇总

C/C++重要知识点汇总(持续更新中)
  • Linux_ever
  • Linux_ever
  • 2016-04-14 16:50
  • 991

C++重要知识点整理-思考

C++中构造函数的多种情况。尤其在构造函数初始化列表这个地方,有点小变数,如果简单地顺理一下,就会非常清晰、简单。关于继承,主要考虑不同访问限制符下,访问权限的问题。请看下面我的整理,现在感觉很清晰。 注:类的对成员的访问,就是拿来就用,为了避免成员明的冲突,可以使用作用域限制符“: :”。 ...
  • wangqingbo0829
  • wangqingbo0829
  • 2014-09-22 20:12
  • 1464

MFC知识点整理

1、MFC包含哪几类程序?
  • woshibendangao
  • woshibendangao
  • 2014-08-06 10:50
  • 654

C/C++重要知识点

成员以其在类中声明的顺序构造 摘要: 分析以下代码的输出:#includeusing namespace std;class A{public: A(int j):age(j) , num(age + 1) { cout阅读全文 posted @ 2013-11-12 16:5...
  • lishenglong666
  • lishenglong666
  • 2015-04-22 17:38
  • 773

C语言重要知识点总结(一)

C语言重要知识点总结(一)最近重新看了下C语言,发现先前学习的时候很多的重点都被忽略了,现在回头看发现了很多以前没有注意的东西,所以写博客记录下,方便以后可以参考查询。 变量的存储类别C语言中变量的存储类别有auto,register,extern和static。下面将对以下四个存储类别进行详细的介...
  • c1s2p3
  • c1s2p3
  • 2015-10-15 20:04
  • 947

struts2重要知识点总结(2)

Action的配置 的配置 通过上面的示例可以看出,Action需要在struts.xml中配置才可以使用,而且Action应该配置成为元素的子元素,那么元素的功能是什么呢? 元素可以把逻辑上相关的一组Action、Result、Intercepter等元素封装起来,形成一个独立的模块,pac...
  • u013730093
  • u013730093
  • 2015-12-13 13:54
  • 865

算法知识点整理

1、算法的几个基本特征是什么?
  • woshibendangao
  • woshibendangao
  • 2014-08-06 11:21
  • 831

一些 Android 重要知识点解析整理

http://www.open-open.com/lib/view/open1428454383026.html Android中的异步任务机制 Android中AsyncTak的使用与源码分析 http://blog.csdn.net/bboyfeiyu/article/de...
  • qq_35521087
  • qq_35521087
  • 2016-07-10 08:56
  • 217
    个人资料
    • 访问:163537次
    • 积分:2882
    • 等级:
    • 排名:第14557名
    • 原创:125篇
    • 转载:1篇
    • 译文:3篇
    • 评论:26条
    最新评论