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

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

  1. __author__ = 'liu'
  2. #coding = utf-8
  3.  
  4. '''
  5. BFPTR排序
  6.  
  7. 采用任意排序算法,将分组后的数据进行排序
  8. 这里采用插入排序算法,比如10个数,则low = 0, high = 10
  9. '''
  10. def insertsort(a, low, high):
  11. for i in range(low + 1, high):
  12. j = i
  13. while j > 0 and a[j] < a[j - 1]:
  14. a[j], a[j - 1] = a[j - 1], a[j]
  15. j -= 1
  16. '''
  17. 分治法,可参考快速排序,将快速排序里的key值由a[low]变为指定的索引值a[keyIdx]
  18. 为了得到将原始数据分为两部分的值对应的索引
  19. '''
  20. def Partion(a, low, high, keyIdx):
  21. a[low],a[keyIdx] = a[keyIdx],a[low]
  22. i = low
  23. j = high
  24. key = a[low]
  25. while i < j:
  26. while a[j] >= key and i < j:
  27. j -= 1
  28. if i < j:
  29. a[i] = a[j]
  30. i += 1
  31. while a[i] <= key and i < j:
  32. i += 1
  33. if i < j:
  34. a[j] = a[i]
  35. j -= 1
  36. a[i] = key
  37. return i

  

  1. '''
  2. 根据给定的值,获取该指定值的索引
  3. '''
  4. def findIdx(a, low, high, num):
  5. for i in range(low,high):
  6. if a[i] == num:
  7. return i
  8. return -1
  9. '''
  10. 假设原数组有n个元素,则以5个元素为一组进行分组,最后得到n/5 + 1组
  11. 最后一组可能不满5个元素
  12. 这里是获取每个分组的中位数
  13. 然后对n/5 + 1个中位数再获取中位数
  14. '''
  15. def findMidNum(a, low, high):
  16. midNum = []
  17. temp = 0
  18. if low == high - 1:
  19. return a[low]
  20. for i in range(low, high - 5, 5):
  21. insertsort(a, i, i + 5)
  22. temp = i
  23. midNum.append(a[i + 2])
  24. num = high - temp
  25. if num > 0:
  26. insertsort(a, temp, temp + num)
  27. midNum.append(a[int(num / 2)])
  28. n = int(high / 5) + 1
  29. insertsort(midNum, 0, n)
  30. return midNum[int(n/2)]

  

  1. def BFPTR(a, low, high, k):
  2. num = findMidNum(a, low, high)
  3. keyIdx = findIdx(a, low, high, num)
  4. i = Partion(a, low, high - 1, keyIdx)
  5. m = i - low + 1
  6. if m == k:
  7. return a[i]
  8. if m > k:
  9. return BFPTR(a, low, i - 1, k)
  10. 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. 02-第一个Java程序

    学习java的第一个程序 记录自己的学习 记录自己的坚持 记录自己的梦想 public class Hello{ public static void main(String[] args) { Sy ...

  2. shiro 身份验证

    shiro身份验证: 参考链接:http://jinnianshilongnian.iteye.com/blog/2019547 即在应用中证明是本人进行操作,一般通过用户名来证明 在shiro中,用 ...

  3. 屏蔽windows快捷键的方法

    using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using ...

  4. Linux下Mysql自启动

    如果你都是按照默认配置安装的那么只要按照如下步骤就可以了 1.cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql   将服 ...

  5. Json3:使用gson做节点解析

    Gson的节点对象:JsonElement : 所有的节点 都是 JsonElement 对象.JsonPrimitive : 基本的数据类型的节点对象,JsonElement的子类JsonNull ...

  6. ngModel缺省是by reference,

    1) 缺省是 by reference, not value,  ngModel, ngOptions等都一样 2) 如果要 track value 用 "track by",   ...

  7. 一、Html5基础讲解以及五个标签

    什么是html?html是用来描述网页的一种语言html指超文本标记语言html不是编程语言,是一种标记语言 HTML基础标签 Head.body html标题 <h1>…<h6&g ...

  8. NodeJs安装以及注意事项

    1.测试NodeJs是否安装成功 node --version npm -v 配置node的可执行文件路径到环境变量path 2.安装相关环境 npm install express -g npm i ...

  9. if 判断语句

    if 条件:if语句块当条件成立的时候会执行if语句块, 如果条件不成立. 不执行语句块的内容 例: money = int(input("请输入你兜里的钱:")) # 300 i ...

  10. Vue.js路由

    有时候,我们在用vue的时候会有这样的需求,比如一个管理系统,点了左边的菜单栏,右边跳转到一个新的页面中,而且刷新的时候还会停留在原来打开的页面. 又或者,一个页面中几个不同的画面来回点击切换,这两种 ...