python实现排序算法四:BFPTR算法
所谓的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算法的更多相关文章
- 分布式共识算法 (四) BTF算法(区块链使用)
系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 前面介绍的算法,无论是 Paxos ...
- python算法与数据结构-算法介绍(31)
一.算法和数据结构 什么是算法和数据结构?如果将最终写好运行的程序比作战场,我们程序员便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰:兵法!故,数据结构和算法是一 ...
- 分布式共识算法 (二) Paxos算法
系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...
- 分布式共识算法 (三) Raft算法
系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 1.1 介绍 Raft 是一种为了管 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序
说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...
- python常见排序算法解析
python——常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...
- python——常见排序算法解析
算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序, ...
- python基本排序算法(一)
一.冒泡排序 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”. 冒泡排序算法的原理如下: 比 ...
随机推荐
- 02-第一个Java程序
学习java的第一个程序 记录自己的学习 记录自己的坚持 记录自己的梦想 public class Hello{ public static void main(String[] args) { Sy ...
- shiro 身份验证
shiro身份验证: 参考链接:http://jinnianshilongnian.iteye.com/blog/2019547 即在应用中证明是本人进行操作,一般通过用户名来证明 在shiro中,用 ...
- 屏蔽windows快捷键的方法
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using ...
- Linux下Mysql自启动
如果你都是按照默认配置安装的那么只要按照如下步骤就可以了 1.cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 将服 ...
- Json3:使用gson做节点解析
Gson的节点对象:JsonElement : 所有的节点 都是 JsonElement 对象.JsonPrimitive : 基本的数据类型的节点对象,JsonElement的子类JsonNull ...
- ngModel缺省是by reference,
1) 缺省是 by reference, not value, ngModel, ngOptions等都一样 2) 如果要 track value 用 "track by", ...
- 一、Html5基础讲解以及五个标签
什么是html?html是用来描述网页的一种语言html指超文本标记语言html不是编程语言,是一种标记语言 HTML基础标签 Head.body html标题 <h1>…<h6&g ...
- NodeJs安装以及注意事项
1.测试NodeJs是否安装成功 node --version npm -v 配置node的可执行文件路径到环境变量path 2.安装相关环境 npm install express -g npm i ...
- if 判断语句
if 条件:if语句块当条件成立的时候会执行if语句块, 如果条件不成立. 不执行语句块的内容 例: money = int(input("请输入你兜里的钱:")) # 300 i ...
- Vue.js路由
有时候,我们在用vue的时候会有这样的需求,比如一个管理系统,点了左边的菜单栏,右边跳转到一个新的页面中,而且刷新的时候还会停留在原来打开的页面. 又或者,一个页面中几个不同的画面来回点击切换,这两种 ...