`
喻红叶
  • 浏览: 39389 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

简单排序算法的时间下界

 
阅读更多

插入排序

插入排序是最简单的排序算法之一,对于N个元素的序列,需要进行N-1次的插入来完成排序。插入排序的算法:

(1)对于位置P,0到P-1位置上的元素已经是有序的,P从1开始;

(2)将P指向的元素放到[0,P]正确的位置,这样0到P位置上的元素也是有序的。

插入排序确实很简单,不需要过多的介绍,直接用一个示例来演示其过程,待排序列:2 4 6 1 3 5 总共有6个元素,所以需要5趟排序,P从1开始

(1)2是一个有序序列

(2)P=1,将4插入到正确位置,排序后:2 4

(3)P=2,将6插入到正确位置,排序后:2 4 6

(4)P=3,将1插入到正确位置,排序后:1 2 4 6

(5)P=4,将3插入到正确位置,排序后:1 2 3 4 6

(6)P=5,将5插入到正确位置,排序后:1 2 3 4 5 6

插入排序代码:

void insertsort(int *A,int n) {
    int i,j;
    int x;
    for(i = 1; i < n; i++) {
        x = A[i];//待插入元素
        for(j = i; j > 0 && A[j - 1] > x; --j)
           A[j] = A[j - 1];

     A[j] = x;
    }
}
上面的代码实现是比较好的,它移动实现了元素移动,却没有明显的使用交换,而是使用x保存待插入元素,不断将x之前的元素往右移动,直到空出适合x插入的位置。

时间复杂度分析

对于P每一个值,代码中第6行的内层for循环最多执行P+1次比较,对所有的P求和:

T(N) = 2 + 3 + 4 + .... + N = O(N^2) = o(N^2)

如果输入是有序的,那么内层for循环就不会执行,因此时间复杂度是O(N),这是最好的情形。平均时间复杂度是:O(N^2) = o(N^2)

简单排序的时间下界

数组的一个逆序:数组中i < j,但A[i] > A[j]的序偶(A[i],A[j])。

在上面的序列中存在(2,1),(4,1),(4,3),(6,1),(6,3),(6,5)这6个逆序。想一下插入排序的过程,如果待插入元素与前面的元素存在逆序,那么就需要交换数据,每次都是和相邻的元素交换,交换一次只能消除一个逆序。也就是说数组中的逆序个数就是排序时的交换次数。 插入排序时,除了交换外还有其他O(N) 项工作,设I为原数组中的逆序数,因此插入排序的时间复杂度是O(I + N)。如果能求出I的平均值,也就求出了插入排序的平均时间复杂度。

定理:N个互异的数组的平均逆序数是N(N - 1) / 4。

证明:对于任意序列L,其反序是~L,对于L中的任意两个数(x,y),且y > x。如果x在y的前面,那么对于~L而言,x就在y的后面,(x,y)就是~L的逆序:

L:..... x ...... y ......

~L:....... y ....... x .......

反之,如果x在y的后面,(x,y)就是L的逆序。总之,对于任意(x,y),它要么是L的逆序,要么是~L的逆序。这样L + ~L的逆序总和是:C(N,2) = N(N - 1) / 2。L的平均逆序就应该是总量的一半:N(N-1) / 4。

序列的平均逆序数是二次的,交换相邻元素只能消除一个逆序。因此,凡是通过只交换相邻元素的排序算法的平均时间是二次的,这是这类算法一个很强的下界。因此我们又得到一个定理:通过交换相邻元素进行排序的任何算法平均需要Ω(N^2)。

这个下界告诉我们,为了以亚二次时间运行,必须要对相距较远的元素进行交换,这样的一次交换可能会消除多个逆序。

转载请注明出处:喻红叶《排序算法的时间下界》

分享到:
评论

相关推荐

    排序算法的下界和如何超越下界.ipynb

    上传时间:2020/11/09 最后测试:2020/11/09 内容:排序算法的下界和如何超越下界原理及实现 其他:pytorch学习练习代码 相关介绍:https://blog.csdn.net/jerry_liufeng/article/details/109587637

    编程界非常经典的十大排序算法

    十大经典排序算法 编程界里面比较公认的十大经典排序算法可以分为两⼤类: ⽐较类排序:通过⽐较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为⾮线性时间⽐较类排序。 ⾮⽐较类排序:不...

    几种常见排序算法实现

    基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 InsertionSort:每次拿起...

    C++线性时间的排序算法分析

    如插入排序(直接插入排序,折半插入排序,希尔排序)、交换排序(冒泡排序,快速排序)、选择排序(简单选择排序,堆排序)、2-路归并排序(可以参考前一篇文章:各种内部排序算法的实现)等,这些排序算法都有一个...

    python 常见的排序算法实现汇总

    要求能够手写时间复杂度位O(nlogn)的排序算法:快速排序、归并排序、堆排序 1.冒泡排序 思想:相邻的两个数字进行比较,大的向下沉,最后一个元素是最大的。列表右边先有序。 时间复杂度$O(n^2)$,原地排序,稳定的...

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.4.1 希尔排序的最坏情形分析7.5 堆排序7.5.1 堆排序的分析7.6 归并排序7.6.1 归并排序的分析7.7 快速排序...

    数据结构与算法分析

     7.3 一些简单排序算法的下界   7.4 谢尔排序   7.5 堆排序   7.6 归并排序   7.7 快速排序   7.7.1 选取枢纽元   7.7.2 分割策略   7.7.3 小数组   7.7.4 实际的快速排序例程  ...

    数据结构与算法分析_Java语言描述(第2版)

    7.3 一些简单排序算法的下界 7.4 希尔排序 7.5 堆排序 7.6 归并排序 7.7 快速排序 7.7.1 选取枢纽元 7.7.2 分割策略 7.7.3 小数组 7.7.4 实际的快速排序例程 7.7.5 快速排序的分析 7.7.6 选择问题的线性期望时间算法...

    ACM算法竞赛常用代码

    排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排 序,外部排序)   数论(整除,集合论,关系,素数,进位制,辗转相除,扩展的辗转相除,同余运算,解线性同余...

    数据结构与算法分析Java语言描述(第二版)

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单...时间算法7.8 排序算法的一般下界7.9 桶式排序7.10 外部排序7.10.1 为什么需要一些新的算法7.10.2 外部排序模型7.10.3 简单算法7.10.4 多路...

    论文研究-三台机并行工件排序问题的改进的下界.pdf

    竞争比是评价在线算法好坏的一个重要指标,而竞争比的下界则是算法设计的一个重要参考。利用反证法,通过构造一个特殊的反例,分析了由此产生的全部9种可能的情形,建立了它们对应的9种线性规划模型,借助计算软件...

    数据结构与算法分析_Java_语言描述

    7.7.6 选择问题的线性期望时间算法 7.8 排序算法的一般下界 7.9 桶式排序 7.10 外部排序 7.10.1 为什么需要新算法 7.10.2 外部排序模型 7.10.3 简单算法 7.10.4 多路合并 7.10.5 多相合并 7.10.6 ...

    算法导论中文版

     8.1 排序算法的下界  8.2 计数排序  8.3 基数排序  8.4 桶排序  思考题  本章注记 第9章 中位数和顺序统计量  9.1 最小值和最大值  9.2 期望为线性时间的选择算法  9.3 最坏情况为线性时间的选择...

    数据结构与算法分析_Java语言描述(第2版)]

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单...时间算法7.8 排序算法的一般下界7.9 桶式排序7.10 外部排序7.10.1 为什么需要一些新的算法7.10.2 外部排序模型7.10.3 简单算法7.10.4 多路...

    分布式算法 作者:(美)Nancy A.Lynch 舒继武 李国东part1

    18.4 从实际时间算法到逻辑时间算法 的变换* 352 18.5 参考文献注释 352 18.6 习题 353 第19章 一致全局快照和稳定属性检测 355 19.1 发散算法的终止检测 355 19.1.1 问题 355 19.1.2 dijkstrascholten算法 356 19.2...

    算法引论:一种创造性方法.[美]Udi Manber(带详细书签).pdf

    10.4.1 寻找简单多边形算法复杂度的下界 10.4.2 关于矩阵的简单归约 10.5 常见的错误 10.6 小结 第11章 NP完全问题 11.1 引言 11.2 多项式时间归约 11.3 非确定性和Cook定理 11.4 NP完全性的证明例子 ...

    论文研究-同类机半在线排序问题及其近似算法.pdf

    论文研究-同类机半在线排序问题及其近似算法.pdf, 研究两台同类机系统两个半在线排序问题 ....文章还研究了上述问题的下界并与我们的算法的最坏情况界进行了比较.

Global site tag (gtag.js) - Google Analytics