| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 常用简单排序 -> 正文阅读 |
|
[数据结构与算法]常用简单排序 |
前言:排序所用的参数及函数形式如下:
为了简单起见,假设是整数数组1.插入排序(Insertion Sort)
N个元素需要N-1趟排序,从P=1到P=N-1
插入排序平均情形:O(N^2) 最好情形:顺序,O(N);? ? ? ? ?最坏情形:逆序,O(N^2) 2.希尔排序(Shell Sort)通过比较相邻相距一定间隔的元素来工作,各趟所用的距离随算法的进行而减少 过程:1.定义增量序列(increment sequence) h1<h2<h3....<ht(h1=1)? 2.对于k=t,t-1,t-2...1,进行hk-sort,注意一个hk-sorted file still remains hk-sorted after hk-1 sorted 序列选择: 一种流行(但是不好)的选择是Shell建议的序列:ht=[N/2],hk-1=[hk/2]
?使用希尔排序的最坏运行情况是O(N^2) 考虑另一种增量Hibbard增量,形如1,3,5,,,,2^k-1 虽然和Shell增量几乎相同,但这些增量间没有公因子 使用Hibbard增量的希尔排序最坏运行时间是O(N^1.5) Tavg – Hibbard ( N ) = O ( N^5/4 ) 3.堆排序(Heap sort)优先队列可以用于花费O(NlogN)的时间进行排序,基于该想法进行的排序叫做堆排序 注意:使用堆时下标从1开始(sentinel在0处),使用堆排序下标从0开始 算法一: T(N)=O(NlogN)
由于tmp数组的使用,双倍空间花销 算法二: 避免使用第二个数组,我们将每次deletemin的元素放到堆的最后(由于每次deletemin之后堆都缩小了1所以正好可以放置最后一个元素)
对N个不同项的随机排列进行堆排序的平均比较次数为2N log N -?O( N log log N ) 4.归并排序(Mergesort)小学期的程设题就有用归并排序和快排的题,记得当时自己和警员在b站上搜的视频一行一行看人家写代码学的(当时半个学期没碰代码了突然让我写这种东西简直就是折磨),当时只觉得递归真难理解,现在再看看觉得好多了,果然有些东西提前接触一下还是有好处的。 算法的基本操作是合并两个已经排序的表,合并部分(Merge)需要自己写具体操作,排序部分(Msort)用递归实现,Mergesort作为Msort的驱动程序。注意归并排序需要一个额外的数组 代码如下
每个merge只花费O(N)的时间 总的来说以O(NlogN)的时间运行 归并排序需要线性的额外内存,并且复制数组是缓慢的。它很少用于内部排序,但对于外部排序非常有用 5.快速排序(Quicksort)快速排序是目前实践中已知的最快的排序算法,它的平均运行时间是O(NlogN),最坏运行时间是O(N^2) 重要的是枢纽元的选取和分割的策略 这里我们枢纽元采用三数中值分割法
分割,是算法的核心。这里由于枢纽元的设定,我们只需要从left+1和right-2开始进行排序即可,下面是排序算法的核心,包括分割和递归调用
Small Array:对于很小的数组(N<=20),快速排序不如插入排序好。而由于快排是递归的,这种小数组的排序情形经常发生,因此我们经常在快排中需要先判断数组大小,对于较小的数组使用插入排序。而我们此前使用统一接口的好处也体现出来,便于直接移植。 另外别忘了驱动程序:
算法分析: 最坏情形T(N)=(N^2) 平均情形T(N)=(NlogN) 6.普遍下界任何只通过比较排序的算法在最坏情况下的计算时间必须为Ω(NlogN) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 14:46:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |