高速分拣(1)的基本算法

    • 的基本算法

      • 1 算法原理
      • 2 划分的实现过程
    • 高速排序算法的性能分析
      • 1最坏情况
      • 2 最好情况
      • 3 平均情况
    • 參考资料

1. 基本算法

1.1 算法原理

高速排序是一种分治排序算法。它将数组划分为左右两个部分,然后分别对这两部分排序。关键在划分的过程中。它将重排数组,使的下面条件成立:

  • 对于某个划分元素指针 i ,a[i]将处于排序后数组的终于的位置上
  • a[l],……,a[i-1] 中的元素都比a[i]小
  • a[i+1],……,a[r] 中的元素都比a[i]大

我们通过划分完毕排序。然后递归的调用该方法处理子文件,每一次划分都会至少使一个元素放到它终于的位置上。

void quick_sort(Item a[], int l, int r)
{
    if(r <= l)
        return;
    Item v = a[r];
    int i = partation(a, l, r);
    quick_sort(a, l, i-1);
    quick_sort(a, i+1, r);
}

1.2 划分的实现过程

  • 1.任选 a[r] 作为划分元素。这个元素在划分后处于它的终于位置上 v = a[r];
  • 2.从数组左端開始扫描,直到找到一个比划分元素大的元素;同一时候,从数组右側開始扫描,直到找到一个比划分元素小的元素停止。
  • 3.步骤2中使扫描停止的这2个元素在终于划分数组中的位置是反的。因此交换这2个元
  • 4.继续步骤2和3,保证位于划分元素指针左側的元素都比 v 小。位于右側的都比 v 大。
  • 5.当扫描指针相遇时,交换划分元素到它的终于位置。此次划分完毕

    [注] 以上相等的元素也会被交换,后面会有改进算法处理反复元素

int partation(Item a[], int l, int r) //划分函数
{
    int i = l-1, j = r;
    Item v = a[r];
    for(;;)
    {
        while(less(a[++i], v));
        while(less(v, a[--j]))
            if(j == l) //v是数组中的最小值
                break;
        if(j <= i) //i, j相遇
            break;
        exch(&a[i], &a[j]);
    }
    exch(&a[i], &a[r]); //交换划分元素到它终于位置
    return i;
}

划分过程是不稳定的,由于每一个元素都有可能被移到大量和它相等的元素(未经检測到)的后面。

至今,没有基于数组的高速排序时稳定的。

2. 高速排序算法的性能分析

2.1.最坏情况

时间复杂度O(N22)次比較

假设调用一个大小为N的有序文件,那么全部的划分都将退化。程序会调用自身N次,每次调用降低一个元素(左側N-1个。右側1个……);

N+(N?1)+(N?2)+……+2+1=(N+1)N2

2.2 最好情况

时间复杂度O(NlgN)次比較

假设每次划分都可以恰好把文件切割成大小相等的两部分,即满足分治法

递归树的深度是lgN,每层的比較O(N)

T(N)=2T(N/2)+N

上式中最后一项的f(N)=N是用于分解问题的代价(次数)

主定理的情形2,f(N)=N=Nlog22log0N

所以

T(N)=Nlog22?log1N=NlgN

2.3 平均情况

时间复杂度O(NlgN)次比較

直观来看就是,最好情况和最坏情况每层交替出现

在一个差的划分后接一个好的划分,下面配图《算法导论》P99

參考资料

1.《算法:C语言实现》P192

2.《算法导论》P98

3. 主定理:https://www.zybuluo.com/quinn/note/77106

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-12 02:28:53

高速分拣(1)的基本算法的相关文章

六白话经典算法系列 高速分拣 高速GET

高速分拣,因为相同的排序效率O(N*logN)几个订购流程更高效,因此,经常使用,再加上高速分拣思想----分而治之的方法也是非常有用的,如此多的软件公司书面采访.它包含了腾讯,微软等知名IT企业宁愿测试此,的考试如软考,考研中也经常出现高速排序的身影. 总的说来,要直接默写出高速排序还是有一定难度的.因为本人就自己的理解对高速排序作了下白话解释,希望对大家理解有帮助,达到高速排序,高速搞定. 高速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它採用了一种分治的策略,通常称其为

一种高速开平方并取倒数算法

今天在查资料过程中,无意中看到这样一段奇妙的代码.决定转载到自己的csdn博客,可是找了半天.愣是没找到csdn转载功能.此前常常看到别人转载文章.然后心里一直在想,是不是转载是一个隐藏功能,或者使用什么命令就能够了.于是特意谷歌了下,原来csdn的转载功能,根本没有什么高速转载.一键转载,仅仅有对着原文复制.粘贴,然后在自己的博客里面又一次排版,最后在公布文章时选择转载,这样该文章就成为一篇转摘的文章了. 这么设计也有道理,仅仅有不嫌麻烦的人.才会耐心的完毕转载,算是提高了转载的门槛.避免出现

综合8种子排序算法总结和比较

1 高速分拣(QuickSort) 高速的排序是一个地方排序,分而治之.海量递归算法.从本质上讲,合并排序地方是版本号. 的以下四个步骤的高速排序可以由. (1) 不多于1个数据.直接返回. (2) 一般选择序列最左边的值作为支点数据. (3) 将序列分成2部分.一部分都大于支点数据,另外一部分都小于支点数据. (4) 对两边利用递归排序数列. 高速排序比大部分排序算法都要快. 虽然我们能够在某些特殊的情况下写出比高速排序快的算法,可是就通常情况而言.没有比它更快的了.高速排序是递归的,对于内存

面试中变相考算法复杂度

一:题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义例如以下: struct ListNode { int m_nValue; ListNode* m_pNext; }; void delete_note(ListNode *head,ListNode *current) { // 空的 if(head == null || current==null) { return; } else if(current->m_pNext != null

目标跟踪算法综述

转自  https://www.zhihu.com/question/26493945 作者:YaqiLYU 第一部分:目标跟踪速览 先跟几个SOTA的tracker混个脸熟,大概了解一下目标跟踪这个方向都有些什么.一切要从2013年的那个数据库说起..如果你问别人近几年有什么比较niubility的跟踪算法,大部分人都会扔给你吴毅老师的论文,OTB50和OTB100(OTB50这里指OTB-2013,OTB100这里指OTB-2015,50和100分别代表视频数量,方便记忆): Wu Y, L

我的Android进阶之旅------&gt;Android采用AES+RSA的加密机制对http请求进行加密

前言 未加密的抓包截图 加密之后的抓包截图 基本需求及概念 AES算法 AES基本原理及算法流程 AES算法流程 RSA算法 RSA算法基本原理及流程 RSA算法实现流程 AES与RSA相结合数据加密方案 Android端 AESRSA结合实践 基本要求 基本流程 Android端 服务器端 java版示例 更多参考 前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息.虽然使用的是HTTPS的方式进行http请求的,但还是被Fidd

POJ训练计划2299_Ultra-QuickSort(归并排序求逆序数)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 39279   Accepted: 14163 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swappin

Androidhttp请求加密机制详解

Android开发中,难免会遇到需要加解密一些数据内容存到本地文件.或者通过网络传输到其他服务器和设备的问题,但并不是使用了加密就绝对安全了,如果加密函数使用不正确,加密数据很容易受到逆向破解攻击.还有很多开发者没有意识到的加密算法的问题. 1.需要了解的基本概念 密码学的三大作用:加密( Encryption).认证(Authentication),鉴定(Identification) 加密:防止坏人获取你的数据. 鉴权:防止坏人假冒你的身份. 明文.密文.密钥.对称加密算法.非对称加密算法,

Android加密算法

基本需求及概念 随着Internet网的广泛应用,信息安全问题日益突出,以数据加密技术为核心的信息安全技术也得到了极大的发展.目前的数据加密技术根据加密密钥类型可分私钥加密(对称加密)系统和公钥加密(非对称加密)系统. 对称加密算法是较传统的加密体制,通信双方在加/解密过程中使用他们共享的单一密钥,鉴于其算法简单和加密速度快的优点,目前仍然是主流的密码体制之一.最常用的对称密码算法是数据加密标准(DES)算法,但是由于DES密钥长度较短,已经不适合当今分布式开放网络对数据加密安全性的要求.最后,