Python笔记 之 最坏情况为线性的选择算法(中位数选择算法)

news/2024/5/19 23:07:32 标签: 算法, python, 快速排序, 排序算法

基于中位数选择获取数值数组A的第i个数据统计量
快速排序(随机化版本)
期望时间为线性的选择算法

时间复杂度

最坏运行时间为O(n)

算法

python">'''
1,将输入数组的n个元素划分为⌊n/5⌋组,每组5个元素,且至多只有一组由剩下的n mod 5个元素组成
2,寻找这⌈n/5⌉组中每一组的中位数:首先对每组元素进行插入排序,然后确定每组有序元素的中位数
3,对第2步中找出的⌈n/5⌉个中位数,递归调用SELECT以找出其中位数x(如果有偶数个中位数,约定x是较小的中位数)
4,利用修改过的PARTITION版本,按中位数的中位数x对输入数据进行划分。
让k比划分的低区间的元素书目多1,因此x是第k小元素,并且有n-k个袁术在划分的高区
5,如果i=k,则返回x。如果i<k,则在地区递归调用SELECT以找出第i小的元素。
如果i>k,则在高区递归查找i-k小的元素
'''

Python算法

python">
def selectNumber(A,p,r,i):
    '''递归获取数组A的第i统计量'''
    if p==r:
        return A[p]
    c=centerNumber(A,p,r)
    k=partition(A, p, r, c)+1
    if k==i:
        return c
    elif k>i:
        return selectNumber(A,p,k-1,i)
    else:
        return selectNumber(A,k,r,i)


def centerNumber(A,p,r):
    '''递归选择数组A[p:r]的中位数'''
    if r-p<5:
        return insertionSortAsc(A, p, r)
    B=[]
    for i in range((r+1-p)//5):
        B.append(insertionSortAsc(A, p+5*i, p+5*i+4))
    if (r+1-p)%5 != 0:
        B.append(insertionSortAsc(A, r-(r-p)%5, r))
    return centerNumber(B,0,len(B)-1)

def insertionSortAsc(A,p,r):
    '''
    原址排序算法的输入A的[p,r]元素
    返回已区间正序排序的A
    '''
    for j in range(p, r + 1):
        key = A[j]
        i = j - 1
        while i >= p and A[i] > key:
            A[i + 1] = A[i]
            i -= 1
        A[i + 1] = key
    return A[(p + r) // 2]

def partition(A,p,r,x):
    '''
    partition为快速排序的关键函数,用来对数组进行原址重拍
    partition选择x作为主元,并围绕x把数组划分成4个(可能为空)区域
    '''
    i = p - 1
    for j in range(p, r):
        if A[j] <= x:
            i = i + 1
            A[i], A[j] = A[j], A[i]
    return i

运行结果

python">import numpy
a=list(numpy.random.randint(1,100,25,int))
print(a)
print(selectNumber(a, 0, len(a)-1, 8))
a.sort()
print(a)

[74, 96, 45, 10, 96, 87, 38, 23, 43, 46, 44, 67, 5, 77, 45, 53, 75, 92, 96, 35, 9, 20, 75, 85, 76, 8, 57, 84, 54, 62, 98, 10, 38, 94, 16, 62, 36, 1]
20
[1, 5, 8, 9, 10, 10, 16, 20, 23, 35, 36, 38, 38, 43, 44, 45, 45, 46, 53, 54, 57, 62, 62, 67, 74, 75, 75, 76, 77, 84, 85, 87, 92, 94, 96, 96, 96, 98]

http://www.niftyadmin.cn/n/752409.html

相关文章

GC:串行、并行、并发收集器

垃圾收集器&#xff08;GC&#xff0c;garbage collector&#xff09;&#xff08;自动内存管理系统&#xff08;automatic storage management system&#xff09;&#xff09;分类&#xff1a; &#xff08;1&#xff09;串行&#xff08;Serial&#xff09;收集器&#xff1…

期末总结

咋么说呢&#xff01;感觉呀&#xff0c;这个学期打了一个学期的摆子&#xff0c;啥都没学到&#xff0c;在学习落下许多。但是呢&#xff01;有句话说的好&#xff0c;时间用在哪里&#xff0c;掌声就在那里&#xff01;尽管学习落下了许多&#xff0c;但是自己在其他方面也收…

Python笔记 之 散列加密标准库

Python标准库的加密支持包括hashlib和hmac模块。 hashlib使用标准算法&#xff08;如md5和sha&#xff09;对消息内容进行散列加密。 hmac则用于验证消息在传输过程中是否被修改。 散列算法 Python散列算法由algorithms_guaranteed和algorithms_available分别提供。 以下是各…

物理内存、虚拟内存、内存、外存(辅存)、磁盘、硬盘、ROM、RAM(主存)(内存条)、寄存器、CPU、总线的联系

硬件构成维度&#xff1a; 存储器包括内部存储器&#xff08;内存&#xff09;、外部存储器&#xff08;外存&#xff09;、寄存器。内存包括只读存储器&#xff08;ROM&#xff0c;Read Only memory&#xff09;&#xff08;只读&#xff0c;断电后数据保留&#xff09;、随机…

vue和react区别

前端都知道3个主流框架&#xff0c;vue,react,anjular&#xff0c;当然目前最火的还是vue和react&#xff0c;那么vue 和react 的区别&#xff1f; 相同点&#xff1a; 1.都支持服务器端渲染 2.都有Virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webCompo…

Python笔记 之 栈(使用list实现)

Python中栈的实现 栈是一种线性数据结构&#xff0c;用后进先出的方式存储数据&#xff0c;栈中数据的插入删除操作都是在栈顶端进行 常见栈的函数操作包括&#xff1a; 压入push 弹出pop 判断empty 栈的属性 用列S[0…n-1]实现一个可以容纳n个元素的栈 该数组有一个属性S.t…

pwnable.kr之fd

题目如图&#xff1a; 在终端输入&#xff1a;ssh fdpwnable.kr -p2222 连接到远程终端&#xff0c;如图&#xff1a; 输入ls -l&#xff0c;查看文件&#xff1a; 输入whoami,查看自身用户名称&#xff1a; 根据题目意思我们只要打开flag文件就可了&#xff0c;但是自身用户名…

Jar包合并(包括jar.exe使用:解压jar、生成jar)

Jar包合并即将Jar包中的文件汇总放进一个新的Jar包中&#xff0c;包括原Jar包解压和生成新Jar包两步。 建议压缩工具打开Jar包&#xff0c;将Jar包中的META-INF删除&#xff0c;对读取依赖没有影响&#xff0c;而且解压时里面的文件会同名覆盖。 Jar包的解压、生成需借助工具…