一个二分partition算法,将整个数组分解为小于某个数和大于某个数的两个部分,然后递归进行排序算法。

法一:

  1. int partition(vector<int>&arr, int begin, int end){
  2. int pivot = arr[begin];
  3. // Last position where puts the no_larger element.
  4. int pos = begin;
  5. for(int i=begin+; i!=end; i++){
  6. if(arr[i] <= pivot){
  7. pos++;
  8. if(i!=pos){
  9. swap(arr[pos], arr[i]);
  10. }
  11. }
  12. }
  13. swap(arr[begin], arr[pos]);
  14. return pos;
  15. }

法二:

  1. int partition(vector<int> &nums, int begin, int end)
  2. {
  3. int pivot = nums[begin];
  4. while(begin < end)
  5. {
  6. while(begin < end && nums[--end] >= pivot);
  7. nums[begin] = nums[end];
  8. while(begin < end && nums[++begin] <= pivot);
  9. nums[end] = nums[begin];
  10. }
  11. nums[begin] = pivot;
  12. return begin;
  13. }

经典的快速排序算法,直接上代码:

  1. void quickSort(vector<int> &nums, int begin, int end)
  2. {
  3. if(end - begin <= )
  4. return;
  5. int mid = partition(nums, begin, end);
  6.  
  7. quickSort(nums, begin, mid);
  8. quickSort(nums, mid, end);
  9. }

数组第K大数值查询

  1. class Solution
  2. {
  3. public:
  4. int findKthLargest(vector<int> &nums, int k)
  5. {
  6. int len = nums.size();
  7. int res = ;
  8. int left = ;
  9. int right = len;
  10. while(left < right)
  11. {
  12. int pos = partition(nums, left, right);
  13. if(pos == len-k)
  14. {
  15. res = nums[pos];
  16. break;
  17. }
  18. else if(pos < len-k)
  19. left = pos+;
  20. else
  21. right = pos;
  22. }
  23. return res;
  24. }
  25. int partition(vector<int> &nums, int begin, int end)
  26. {
  27. int pivot = nums[begin];
  28. while(begin < end)
  29. {
  30. while(begin < end && nums[--end] >= pivot);
  31. nums[begin] = nums[end];
  32. while(begin < end && nums[++begin] <= pivot);
  33. nums[end] = nums[begin];
  34. }
  35. nums[begin] = pivot;
  36. return begin;
  37. }
  38. };

二分partition算法应用的更多相关文章

  1. Partition算法剖析

    博文链接:http://haoyuanliu.github.io/2016/12/18/Partition%E7%AE%97%E6%B3%95%E5%89%96%E6%9E%90/ 对,我是来骗访问量 ...

  2. Partition算法以及其应用详解下(Golang实现)

    接前文,除了广泛使用在快速排序中.Partition算法还可以很容易的实现在无序序列中使用O(n)的时间复杂度查找kth(第k大(小)的数). 同样根据二分的思想,每完成一次Partition我们可以 ...

  3. Partition算法以及其应用详解上(Golang实现)

    最近像在看闲书一样在看一本<啊哈!算法> 当时在amazon上面闲逛挑书,看到巨多人推荐这本算法书,说深入浅出简单易懂便买来阅读.实际上作者描述算法的能力的确令人佩服.就当复习常用算法吧. ...

  4. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  5. c#-二分查找-算法

    折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小 ...

  6. 二分查找算法(JAVA)

    1.二分查找又称折半查找,它是一种效率较高的查找方法. 2.二分查找要求:(1)必须采用顺序存储结构 (2).必须按关键字大小有序排列 3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位 ...

  7. 二分查找算法java实现

    今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索 ...

  8. Java学习之二分查找算法

    好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己 ...

  9. python函数(4):递归函数及二分查找算法

    人理解循环,神理解递归!  一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? ""& ...

随机推荐

  1. 浅谈JavaScript位操作符

    因为ECMAscript中所有数值都是以IEEE-75464格式存储,所以才会诞生了位操作符的概念. 位操作符作用于最基本的层次上,因为数值按位存储,所以位操作符的作用也就是操作数值的位.不过位操作符 ...

  2. ubuntu16.04卸载软件

    root@test:/# dpkg -l | grep cobbler root@test:/# sudo dpkg --purge cobbler

  3. 了解c3p0,dbcp与druid

    说到druid,这个是在开源中国开源项目中看到的,说是比较好的数据连接池.于是乎就看看.扯淡就到这. 下面就讲讲用的比较多的数据库连接池.(其实我最先接触的是dbcp这个) 1)DBCP DBCP是一 ...

  4. html头部规范书写

    建立标准化的声明(DOCTYPE)和head 以前的网页,甚至大型的门户网站也连个声明也没有,就仅仅是<html>,现在要做的就是给你的网页加上声明,规范head区域,让搜索引擎和喜欢你的 ...

  5. Linux显示cat帮助信息并退出

    Linux显示cat帮助信息并退出 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ cat --help 用法:cat [选项]... [文件]... 将[文件 ...

  6. C#数据缓存介绍及Caching通用帮助类整理

    C#缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 以下为 ...

  7. Java并发 线程池

    线程池技术就是事先创建一批线程,这批线程被放入到一个池子里,在没有请求到达服务端时候,这些线程都是处于待命状态,当请求到达时候,程序会从线程池里取出一个线程,这个线程处理到达的请求,请求处理完毕,该线 ...

  8. tomcat原理(三)结合公司tomcat的用法的在理解

    一,server.xml文件 <?xml version="1.0" encoding="UTF-8"?> <Server port=&quo ...

  9. phpstorm 2017.3.3的安装和破解

    首先先下载phpstorm安装包,可以直接百度phpstorm就有了,或者打开这个链接:https://www.jetbrains.com/zh/phpstorm/specials/phpstorm/ ...

  10. Android App性能评测分析-流畅度篇

    1.前言 在手机App竞争越来越激烈的今天,Android App的各项性能特别是流畅度不如IOS,安卓基于java虚拟机运行,触控响应的延迟和卡顿比IOS系统严重得多.一些下拉上滑.双指缩放快速打字 ...