我的小快排(两种分割方法)
今天看到微博上有人转一篇文章,题目是《你问什么写不好快排》,看看自己多长时间能把快排写出来。结果,果然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
我的小快排(两种分割方法)相关推荐
- 快排两种实现及五种优化
快速排序是一个优秀的排序算法,O(n²)和Ω(nlgn),期望运行时间:θ(nlgn)且常数因子较小. 快排运用了分治的思想: 分:将数组划分成两部分(核心,partition) 治:递归地对划分地两 ...
- PDF分割成一页一页的怎么做?分享两种分割页面小妙招
如何将PDF文件分割成一页一页的呢?大家在使用PDF文件的过程中,肯定会遇到需要编辑文件的时候,有时是文件的内容出现了错误,有时是需要合并或者分割页面,就比如我们遇到需要将PDF文件分割成一页一页的时 ...
- edge不能打开html网页,win10自带浏览器Edge打不开网页的两种修复方法
Windows10专业版自带的Edge浏览器十分好用,其实内置很多其他浏览器没有的功能,深受网友们喜爱.不过在使用过程中也遇到一点问题,比如Edge打不开网页,不懂哪里出现问题,尝试多次还是一样.大家 ...
- 快排三种基本解法以及两种快排优化
/* 快速排序 基本思想 选定每次排序的基准数据 在剩下的位置将小于基准值的数据放在基准值得左边,大于基准值的数据放到基准值的右边 一次划分之后 如果此基准值的左右两边仍存在大于两个数 ...
- ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约
ETH:Windows搭建ETH(区块链技术)利用Web端和小程序端两种方式调用ETH上的SC智能合约 目录 1.Geth安装.配置文件.与ETH节点交互 1.1.下载并安装好geth客户端 1.2. ...
- 电动汽车 V2G 放电模型 算法 考虑电动汽车家庭慢充和充电站快充两种模式下,模拟出一定数量电动汽车的日负荷曲线
电动汽车 V2G 放电模型 算法 包含两个程序,均基于matlab,实现以下两个功能: 1.考虑电动汽车家庭慢充和充电站快充两种模式下,模拟出一定数量电动汽车的日负荷曲线: 2.考虑V2G的电动汽车放 ...
- 快速排序的两种实现方法(c语言版本)
经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...
- c语言键盘按f1显示f1,windows10键盘f1变成功能键的两种解决方法
现在越来越多朋友都升级系统到win10正式版,因此他们反馈的win10系统相关问题也增多了.比如,有位用户表示电脑升级到win10后,F1~F12都没办法使用了,变成了功能键,都不用按下FN了,按了F ...
- 怎么把PDF文件拆分开来?教你两种拆分方法
一份PDF文件,我们如何能够将它的内容给拆分开来呢?大家都知道,PDF文件是不容易改动的,但是我们在工作中又经常使用到它,这就难免会遇到需要编辑的PDF文件,其中就有遇到文件内容特别多的PDF文件,我 ...
最新文章
- 【原创】Aspose.Words组件介绍及使用—基本介绍与DOM概述
- linux命令之高级使用 find
- php 获取html中图片不显示,HTML中img标签src属性用PHP设置后不显示
- python医学图像读取_对python读取CT医学图像的实例详解
- python子进程kerberos_Anaconda3的python找不到kerberos凭证缓存
- 基础编程题之最近公共祖先
- java 日志管理源码_Java源码初探_logging日志模块实现
- 字节跳动最新开源!java条件运算符判断三个数大小
- Android Lazy url
- 二分图带权最大匹配费用流_简单理解二分图与匈牙利算法
- HDU1230 火星A+B【进制】
- 文字旋转_如何制作抖音文字旋转视频?推荐这款超火的抖音文字动画制作神器...
- Win10如何用命令行查看MD5
- 分布式任务调度框架设计与实现解读(1)
- 做好目标管理和任务管理,提高办公协同效率
- 短视频“音频化”,音乐“视频化”
- 如何设置 RecyclerView Item内子控件点击事件
- PhotoShop永久序列号
- 2021-12-17
- 最全CSS基础知识图片形式整理
热门文章
- wordpress教程之函数site_url()、home_url()、bloginfo(‘url’)的区别
- 如何看待现在一些年轻人秉持「简单是福、平淡是真」的随遇而安的生活态度?...
- 工作那些事儿(8)- 废旧立新
- zeroc ice的概念、组成与服务
- VC中用到的几种调试输出TRACE的方法及其区别
- C Runtime Library来历, API, MFC, ATL关系
- 问题 D: 编写函数:比较字符串 之二 (Append Code)
- sd卡测速工具_怎样恢复SD卡数据?教你两招轻松恢复
- 人工智能python营_贪心学习院人工智能python编程特训营
- 合作开发过程产生的专利_合作开发合同(二)