今天看到微博上有人转一篇文章,题目是《你问什么写不好快排》,看看自己多长时间能把快排写出来。结果,果然20分钟没写出来,本来以为明白原理,结果实现的出现各种问题,小 bug。最终花了半个点,写出来了,就是下面代码中 partition版本的。后来又翻了下算法导论,看到上面的快排,写了第二个分割子函数 partition2,这个原理更加清楚,用的是一个循环不变式的原理,将数组划分为了四个区域,具体说明可以参照算法导论。下面贴下代码,自己mark 一下。

算法导论上partition过程的伪代码如下

partition(A,p,r)x <- A[r]i <- p - 1for j <- p to r - 1do if A[j] <= xthen i <- i +1exchange A[i] <-> A[j]exchange A[i+1] <-> A[r]return i+1

对于循环的每一轮迭代的开始,对于任何数组下标k,有

1)  如果 p <= k <= i,则 A[k] <= x

2)  如果 i + 1 <= k <= j - 1,则A[k] > x

3) 如果k = r,则 A[k] = x

package com.deron.business;/*** this is quick sort tool class* * @author deron* */public class QSort {public static void qSort(int[] array) {qSort(array, 0, array.length - 1);}public static void qSort(int[] array, int start, int end) {if (start < end) {int t = partition2(array, start, end);qSort(array, start, t - 1);qSort(array, t + 1, end);}}public static int partition(int[] array, int start, int end) {int t = start;int lp = start + 1;int rp = end;while (lp < rp) {while (array[lp] <= array[t] && lp < rp)lp++;while (array[rp] >= array[t] && lp < rp)rp--;if (lp < rp) {int tmp = array[lp];array[lp] = array[rp];array[rp] = tmp;lp++;rp--;}}if (array[lp] <= array[t]) {int tmp = array[t];array[t] = array[lp];array[lp] = tmp;t = lp;} else {int tmp = array[t];array[t] = array[lp - 1];array[lp - 1] = tmp;t = lp - 1;}return t;}public static int partition2(int[] array, int start, int end) {int v = array[start];int lp = start;int rp = start + 1;for (; rp <= end; rp++) {if (array[rp] <= v) {lp++;int tmp = array[lp]; array[lp] = array[rp];array[rp]= tmp; }}array[start] = array[lp];array[lp]= v; return lp;}
}

转载于:https://www.cnblogs.com/quincy-qiu/archive/2013/05/03/4014357.html

我的小快排(两种分割方法)相关推荐

  1. 快排两种实现及五种优化

    快速排序是一个优秀的排序算法,O(n²)和Ω(nlgn),期望运行时间:θ(nlgn)且常数因子较小. 快排运用了分治的思想: 分:将数组划分成两部分(核心,partition) 治:递归地对划分地两 ...

  2. PDF分割成一页一页的怎么做?分享两种分割页面小妙招

    如何将PDF文件分割成一页一页的呢?大家在使用PDF文件的过程中,肯定会遇到需要编辑文件的时候,有时是文件的内容出现了错误,有时是需要合并或者分割页面,就比如我们遇到需要将PDF文件分割成一页一页的时 ...

  3. edge不能打开html网页,win10自带浏览器Edge打不开网页的两种修复方法

    Windows10专业版自带的Edge浏览器十分好用,其实内置很多其他浏览器没有的功能,深受网友们喜爱.不过在使用过程中也遇到一点问题,比如Edge打不开网页,不懂哪里出现问题,尝试多次还是一样.大家 ...

  4. 快排三种基本解法以及两种快排优化

    /*  快速排序  基本思想    选定每次排序的基准数据 在剩下的位置将小于基准值的数据放在基准值得左边,大于基准值的数据放到基准值的右边    一次划分之后 如果此基准值的左右两边仍存在大于两个数 ...

  5. ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约

    ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约 目录 1.Geth安装.配置文件.与ETH节点交互 1.1.下载并安装好geth客户端 1.2. ...

  6. 电动汽车 V2G 放电模型 算法 考虑电动汽车家庭慢充和充电站快充两种模式下,模拟出一定数量电动汽车的日负荷曲线

    电动汽车 V2G 放电模型 算法 包含两个程序,均基于matlab,实现以下两个功能: 1.考虑电动汽车家庭慢充和充电站快充两种模式下,模拟出一定数量电动汽车的日负荷曲线: 2.考虑V2G的电动汽车放 ...

  7. 快速排序的两种实现方法(c语言版本)

    经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...

  8. c语言键盘按f1显示f1,windows10键盘f1变成功能键的两种解决方法

    现在越来越多朋友都升级系统到win10正式版,因此他们反馈的win10系统相关问题也增多了.比如,有位用户表示电脑升级到win10后,F1~F12都没办法使用了,变成了功能键,都不用按下FN了,按了F ...

  9. 怎么把PDF文件拆分开来?教你两种拆分方法

    一份PDF文件,我们如何能够将它的内容给拆分开来呢?大家都知道,PDF文件是不容易改动的,但是我们在工作中又经常使用到它,这就难免会遇到需要编辑的PDF文件,其中就有遇到文件内容特别多的PDF文件,我 ...

最新文章

  1. 【原创】Aspose.Words组件介绍及使用—基本介绍与DOM概述
  2. linux命令之高级使用 find
  3. php 获取html中图片不显示,HTML中img标签src属性用PHP设置后不显示
  4. python医学图像读取_对python读取CT医学图像的实例详解
  5. python子进程kerberos_Anaconda3的python找不到kerberos凭证缓存
  6. 基础编程题之最近公共祖先
  7. java 日志管理源码_Java源码初探_logging日志模块实现
  8. 字节跳动最新开源!java条件运算符判断三个数大小
  9. Android Lazy url
  10. 二分图带权最大匹配费用流_简单理解二分图与匈牙利算法
  11. HDU1230 火星A+B【进制】
  12. 文字旋转_如何制作抖音文字旋转视频?推荐这款超火的抖音文字动画制作神器...
  13. Win10如何用命令行查看MD5
  14. 分布式任务调度框架设计与实现解读(1)
  15. 做好目标管理和任务管理,提高办公协同效率
  16. 短视频“音频化”,音乐“视频化”
  17. 如何设置 RecyclerView Item内子控件点击事件
  18. PhotoShop永久序列号
  19. 2021-12-17
  20. 最全CSS基础知识图片形式整理

热门文章

  1. wordpress教程之函数site_url()、home_url()、bloginfo(‘url’)的区别
  2. 如何看待现在一些年轻人秉持「简单是福、平淡是真」的随遇而安的生活态度?...
  3. 工作那些事儿(8)- 废旧立新
  4. zeroc ice的概念、组成与服务
  5. VC中用到的几种调试输出TRACE的方法及其区别
  6. C Runtime Library来历, API, MFC, ATL关系
  7. 问题 D: 编写函数:比较字符串 之二 (Append Code)
  8. sd卡测速工具_怎样恢复SD卡数据?教你两招轻松恢复
  9. 人工智能python营_贪心学习院人工智能python编程特训营
  10. 合作开发过程产生的专利_合作开发合同(二)