2.5 3-way quickSort
1.排序时,数组含有大量重复元素,应该使用哪种排序手段?
(1)mergeSort:与数组的特征无关,比较次数总是在1/2NlgN~NlgN之间
(2)quickSort:当所有的元素全都相同的时候,使用平方次时间
2.3-way partitioning算法的目标:
将数组划分为3部分:
(1)lt和gt之间的元素等于v
(2)lt的左边元素小于v
(3)gt的右边元素大于v

3.Dijkstra的3-way partitioning算法:
(1)划分元素v是a[lo]
(2)scan i from left to right
①a[i]<v:交换a[i]和a[lt],同时增大lt和i
②a[i]>v:交换a[i]和a[gt],减小gt
③a[i]==v:增大i(也就是不移动相等的元素)
i指向未遍历的元素,lt左边是比v小的,gt右边是比v大的,lt与i之间的是等于v的元素。
这个操作保证了等于v的元素 in place,接下来只需要分别对大于v和小于v的两个部分分别排序。

4.如果打乱数组,并且使用3-way partitioning,很多应用运行时间会是线性时间,会比mergesort快很多。
5.算法实现
package com.cx.sort;
public class Quick3way {
public static void sort(Comparable[] a) {
//打乱数组
Shuffling.sort(a);
sort(a,0,a.length-1);
}
public static void sort(Comparable[] a,int lo,int hi) {
if(hi<=lo) return;
int lt=lo,gt=hi,i=lo;
Comparable v=a[lo];
//只要i和gt不重叠就要继续进行
//完成后,lt左边小于v,gt右边大于v,lt..gt等于v
while(i<=gt) {
int cmp=a[i].compareTo(v);
//a[i]<v,交换a[lt]和a[i]
if(cmp<0) exch(a, i++, lt++);
//a[i]>v,交换a[i]和a[gt]
else if(cmp>0) exch(a, i, gt--);
//保证等于v的元素in place
else i++;
}
//递归排序lt左侧和gt右侧部分
sort(a, lo, lt-1);
sort(a, gt+1, hi);
}
private static boolean less(Comparable v,Comparable w) {
return v.compareTo(w)<0;
}
private static void exch(Comparable[] a,int i ,int j ) {
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
private static void show(Comparable[] a) {
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
String a[]= {"s","o","r","t","e","x","a","m","p","l","e"};
show(a);
sort(a);
show(a);
}
}
2.5 3-way quickSort的更多相关文章
- quickSort算法导论版实现
本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...
- Javascript算法系列之快速排序(Quicksort)
原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...
- JavaScript 快速排序(Quicksort)
"快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...
- QuickSort 快速排序 基于伪代码实现
本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...
- quicksort
快排.... void quicksort(int *a,int left,int right){ if(left >= right){ return ; } int i = left; int ...
- 随手编程---快速排序(QuickSort)-Java实现
背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...
- 算法实例-C#-快速排序-QuickSort
算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...
- python Quicksort demo
__author__ = 'student' ''' quicksort step 1, choose one pivot, such as pivot=la[0] step 2, scan the ...
- 63.如何对单链表进行快排?和数组快排的分析与对比[quicksort of array and linked list]
[本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向. ...
- 这个代码怎么改??Help快速排序 quicksort
#include<stdio.h>int a[101],n;void quicksort(int left,int right){ int i,j,t,temp; if(l ...
随机推荐
- Java 208道面试题及部分答案
---恢复内容开始--- 一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件 ...
- 简单工厂模式及php实现
简单工厂模式(Simple Factory Pattern): 又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,可以根据参数的不同返回不同类 ...
- css的过渡背景色
css3新增的渐变背景色属性用法 原博客地址:http://caibaojian.com/css3-background-gradient.html
- Android基础夯实--重温动画(四)之属性动画 ValueAnimator详解
宝剑锋从磨砺出,梅花香自苦寒来:千淘万漉虽辛苦,吹尽狂沙始到金: 长风破浪会有时,直挂云帆济沧海 一.摘要 Animator类作为属性动画的基类,它是一个抽象类,它提供了实现动画的基本架构,但是我们不 ...
- 掌握Spark机器学习库-02-mllib数据格式
MLlib 1.MLlib介绍 1)MLlib特点 2)哪些算法 3)阅读官方文档 MLlib提供了哪些: 算法 特征工程 管道 持久化 2.MLlib数据格式 1)本地向量 2)标签数据 3)本地矩 ...
- Windows下使用JMeter
简介 Apache JMeter是100%纯java桌面应用程序,被设计用来测试C/S结构的软件(例如web应用程序).它可以被用来测试包括基于静态和动态资源程序的性能,例如静态文件,Java Ser ...
- markdown表格中怎么插入逻辑或符号|?
| 73向下投票接受 | 如果你删除反引号(****),使用|`黑客作品 a | r ------------|----- `a += x;` | r1 a |= y; | r2 并产生以下输出 在这 ...
- SQLServer性能优化专题
SQLServer性能优化专题 01.SQLServer性能优化之----强大的文件组----分盘存储(水平分库) http://www.cnblogs.com/dunitian/p/5276431. ...
- 大众点评APP分析随笔
移动APP:大众点评 一.最核心功能:店铺评价功能,用户可以通过此功能对商家进行评分,也可以获取其他人对商家的评分信息. 二.核心功能满足的需求: 1. 去过商家消费的用户:用户已经体验的商家提供的产 ...
- Ajax请求WebService跨域问题
1.背景 用Jquery中Ajax方式在asp.net开发环境中WebService接口的调用 2.出现的问题 原因分析:浏览器同源策略的影响(即JavaScript或Cookie只能访问同域下的内容 ...