所谓的BFPTR算法就是从n个数中寻找最小的K个数,主要思想可以参考注释,写得不是很好,特别是寻找中位数的中位数的时候,欢迎指正:

采用任意排序算法,将分组后的数据进行排序:

__author__ = 'liu'
#coding = utf-8 '''
BFPTR排序 采用任意排序算法,将分组后的数据进行排序
这里采用插入排序算法,比如10个数,则low = 0, high = 10
'''
def insertsort(a, low, high):
for i in range(low + 1, high):
j = i
while j > 0 and a[j] < a[j - 1]:
a[j], a[j - 1] = a[j - 1], a[j]
j -= 1
'''
分治法,可参考快速排序,将快速排序里的key值由a[low]变为指定的索引值a[keyIdx]
为了得到将原始数据分为两部分的值对应的索引
'''
def Partion(a, low, high, keyIdx):
a[low],a[keyIdx] = a[keyIdx],a[low]
i = low
j = high
key = a[low]
while i < j:
while a[j] >= key and i < j:
j -= 1
if i < j:
a[i] = a[j]
i += 1
while a[i] <= key and i < j:
i += 1
if i < j:
a[j] = a[i]
j -= 1
a[i] = key
return i

  

'''
根据给定的值,获取该指定值的索引
'''
def findIdx(a, low, high, num):
for i in range(low,high):
if a[i] == num:
return i
return -1
'''
假设原数组有n个元素,则以5个元素为一组进行分组,最后得到n/5 + 1组
最后一组可能不满5个元素
这里是获取每个分组的中位数
然后对n/5 + 1个中位数再获取中位数
'''
def findMidNum(a, low, high):
midNum = []
temp = 0
if low == high - 1:
return a[low]
for i in range(low, high - 5, 5):
insertsort(a, i, i + 5)
temp = i
midNum.append(a[i + 2])
num = high - temp
if num > 0:
insertsort(a, temp, temp + num)
midNum.append(a[int(num / 2)])
n = int(high / 5) + 1
insertsort(midNum, 0, n)
return midNum[int(n/2)]

  

def BFPTR(a, low, high, k):
num = findMidNum(a, low, high)
keyIdx = findIdx(a, low, high, num)
i = Partion(a, low, high - 1, keyIdx)
m = i - low + 1
if m == k:
return a[i]
if m > k:
return BFPTR(a, low, i - 1, k)
return BFPTR(a, i + 1, high, k - m)

  

python实现排序算法四:BFPTR算法的更多相关文章

  1. 分布式共识算法 (四) BTF算法(区块链使用)

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 前面介绍的算法,无论是 Paxos ...

  2. python算法与数据结构-算法介绍(31)

    一.算法和数据结构 什么是算法和数据结构?如果将最终写好运行的程序比作战场,我们程序员便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰:兵法!故,数据结构和算法是一 ...

  3. 分布式共识算法 (二) Paxos算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...

  4. 分布式共识算法 (三) Raft算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 1.1 介绍 Raft 是一种为了管 ...

  5. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  6. python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序

    说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...

  7. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  8. python——常见排序算法解析

    算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...

  9. python基本排序算法(一)

    一.冒泡排序 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”. 冒泡排序算法的原理如下: 比 ...

随机推荐

  1. Redis 主从+哨兵+监控 (centos7.2 + redis 3.2.9 )

    环境准备: 192.168.0.2  redis01 主 192.168.0.3  redis02 从 192.168.0.4  redis03 从 Redis 主从搭建 一:下载并安装redis软件 ...

  2. Spring Boot安装及入门实现

    在Eclipse里使用Spring boot,首先需要安装Spring boot的插件STS. 注意:STS插件3.7.0以上版本启动需要JDK1.8 打开Eclipse 菜单栏 Help -> ...

  3. 提示:pip install --upgrade pip

    安装模块时报错了,提示我需要更新pip,如下所示: 但是使用pip install --upgrade pip时依然报这个错,原来是命令应该这样写: python -m pip install -U ...

  4. webkitAnimationEnd动画事件

    春节终于过完了,自己春节似乎过的有点大,过完春节之后,态度一直没有调整好,总有一股过节的情绪,没有完全进入学习和工作的状态来.继续调整当中…… 这两天项目中遇到一个小需求,十分类似于支付宝蚂蚁森林给小 ...

  5. Oracle Service Bus (OSB) 12c 的配置安装

    Oracle Service Bus (OSB) 12c 的配置安装 1.OSB配置环境: Oracle Database Oracle Fusion Middleware Infrastructur ...

  6. [UGUI]图文混排(二):Text源码分析

    UGUI源码: https://bitbucket.org/Unity-Technologies/ui/downloads/?tab=tags 首先下载一份UGUI源码,这里我下载的版本是5.3.2f ...

  7. 28.Mongodb问题解决

    mongodb问题配置解决: 之前官网下载msi文件安装总是出现问题,这次使用zip压缩包直接解压使用(较为省力). 链接:https://pan.baidu.com/s/1G-jh7CXD1gCz8 ...

  8. kettle实现简单的增量同步

    下载 pdi-ce-7.0.0.0-25.zip 解压 安装jdk 1.7以上的版本 配置环境变量 下载并将mysql-connector-java-5.1.39.jar 拷贝到 \data-inte ...

  9. 关于URI和URL的区别

    URI:统一资源标志符(Uniform Resource Identifier)URL:统一资源定位符(uniform resource location) URN = Universal Resou ...

  10. python 求3到8位数的水仙花数Pycharm实现

    #-*- coding: utf-8-*-import timeimport math#获取3位数的水仙花数start1 = time.time()start = time.time() number ...