Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
70147f8d
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
70147f8d
编写于
11月 17, 2009
作者:
A
alanb
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6901318: Yet more Dual-pivot quicksort improvements
Reviewed-by: jjb Contributed-by: vladimir.yaroslavskiy@sun.com
上级
78b86e45
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
335 addition
and
258 deletion
+335
-258
src/share/classes/java/util/DualPivotQuicksort.java
src/share/classes/java/util/DualPivotQuicksort.java
+335
-258
未找到文件。
src/share/classes/java/util/DualPivotQuicksort.java
浏览文件 @
70147f8d
...
...
@@ -36,15 +36,17 @@ package java.util;
* @author Jon Bentley
* @author Josh Bloch
*
* @version 2009.11.
09 m765.827.v8
* @version 2009.11.
16 m765.827.v12a
*/
final
class
DualPivotQuicksort
{
// Suppresses default constructor
/**
* Suppresses default constructor.
*/
private
DualPivotQuicksort
()
{}
/*
* Tuning
P
arameters.
* Tuning
p
arameters.
*/
/**
...
...
@@ -66,7 +68,7 @@ final class DualPivotQuicksort {
private
static
final
int
COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR
=
32768
;
/*
* Sorting methods for
the seven
primitive types.
* Sorting methods for
7
primitive types.
*/
/**
...
...
@@ -112,7 +114,6 @@ final class DualPivotQuicksort {
for
(
int
k
=
left
+
1
;
k
<=
right
;
k
++)
{
int
ak
=
a
[
k
];
int
j
;
for
(
j
=
k
-
1
;
j
>=
left
&&
ak
<
a
[
j
];
j
--)
{
a
[
j
+
1
]
=
a
[
j
];
}
...
...
@@ -140,16 +141,20 @@ final class DualPivotQuicksort {
int
e4
=
e3
+
sixth
;
int
e2
=
e3
-
sixth
;
// Sort these elements in place using a 5-element sorting network
if
(
a
[
e1
]
>
a
[
e2
])
{
int
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e2
];
a
[
e2
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
int
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e3
])
{
int
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
int
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e4
])
{
int
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e3
]
>
a
[
e4
])
{
int
t
=
a
[
e3
];
a
[
e3
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e5
])
{
int
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
int
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
int
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
// Sort these elements using a 5-element sorting network
int
ae1
=
a
[
e1
],
ae2
=
a
[
e2
],
ae3
=
a
[
e3
],
ae4
=
a
[
e4
],
ae5
=
a
[
e5
];
if
(
ae1
>
ae2
)
{
int
t
=
ae1
;
ae1
=
ae2
;
ae2
=
t
;
}
if
(
ae4
>
ae5
)
{
int
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
if
(
ae1
>
ae3
)
{
int
t
=
ae1
;
ae1
=
ae3
;
ae3
=
t
;
}
if
(
ae2
>
ae3
)
{
int
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae1
>
ae4
)
{
int
t
=
ae1
;
ae1
=
ae4
;
ae4
=
t
;
}
if
(
ae3
>
ae4
)
{
int
t
=
ae3
;
ae3
=
ae4
;
ae4
=
t
;
}
if
(
ae2
>
ae5
)
{
int
t
=
ae2
;
ae2
=
ae5
;
ae5
=
t
;
}
if
(
ae2
>
ae3
)
{
int
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae4
>
ae5
)
{
int
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
a
[
e1
]
=
ae1
;
a
[
e3
]
=
ae3
;
a
[
e5
]
=
ae5
;
/*
* Use the second and fourth of the five sorted elements as pivots.
...
...
@@ -162,8 +167,8 @@ final class DualPivotQuicksort {
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
*/
int
pivot1
=
a
[
e2
]
;
a
[
e2
]
=
a
[
left
];
int
pivot2
=
a
[
e4
]
;
a
[
e4
]
=
a
[
right
];
int
pivot1
=
a
e2
;
a
[
e2
]
=
a
[
left
];
int
pivot2
=
a
e4
;
a
[
e4
]
=
a
[
right
];
/*
* Partitioning
...
...
@@ -192,21 +197,25 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
int
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
if
(
ak
>
pivot2
)
{
while
(
a
[
great
]
>
pivot2
&&
k
<
great
)
{
great
--;
while
(
a
[
great
]
>
pivot2
)
{
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -234,24 +243,28 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
int
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
continue
;
continue
;
}
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
else
{
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
{
// a[k] > pivot
while
(
a
[
great
]
>
pivot1
)
{
great
--;
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -283,19 +296,19 @@ final class DualPivotQuicksort {
while
(
a
[
less
]
==
pivot1
)
{
less
++;
}
for
(
int
k
=
less
+
1
;
k
<=
great
;
k
++)
{
if
(
a
[
k
]
==
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
}
while
(
a
[
great
]
==
pivot2
)
{
great
--;
}
for
(
int
k
=
great
-
1
;
k
>=
less
;
k
--)
{
if
(
a
[
k
]
==
pivot2
)
{
for
(
int
k
=
less
+
1
;
k
<=
great
;
)
{
int
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
a
[
k
++]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
else
if
(
ak
==
pivot2
)
{
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
pivot2
;
}
else
{
k
++;
}
}
}
...
...
@@ -347,7 +360,6 @@ final class DualPivotQuicksort {
for
(
int
k
=
left
+
1
;
k
<=
right
;
k
++)
{
long
ak
=
a
[
k
];
int
j
;
for
(
j
=
k
-
1
;
j
>=
left
&&
ak
<
a
[
j
];
j
--)
{
a
[
j
+
1
]
=
a
[
j
];
}
...
...
@@ -375,16 +387,20 @@ final class DualPivotQuicksort {
int
e4
=
e3
+
sixth
;
int
e2
=
e3
-
sixth
;
// Sort these elements in place using a 5-element sorting network
if
(
a
[
e1
]
>
a
[
e2
])
{
long
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e2
];
a
[
e2
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
long
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e3
])
{
long
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
long
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e4
])
{
long
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e3
]
>
a
[
e4
])
{
long
t
=
a
[
e3
];
a
[
e3
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e5
])
{
long
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
long
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
long
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
// Sort these elements using a 5-element sorting network
long
ae1
=
a
[
e1
],
ae2
=
a
[
e2
],
ae3
=
a
[
e3
],
ae4
=
a
[
e4
],
ae5
=
a
[
e5
];
if
(
ae1
>
ae2
)
{
long
t
=
ae1
;
ae1
=
ae2
;
ae2
=
t
;
}
if
(
ae4
>
ae5
)
{
long
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
if
(
ae1
>
ae3
)
{
long
t
=
ae1
;
ae1
=
ae3
;
ae3
=
t
;
}
if
(
ae2
>
ae3
)
{
long
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae1
>
ae4
)
{
long
t
=
ae1
;
ae1
=
ae4
;
ae4
=
t
;
}
if
(
ae3
>
ae4
)
{
long
t
=
ae3
;
ae3
=
ae4
;
ae4
=
t
;
}
if
(
ae2
>
ae5
)
{
long
t
=
ae2
;
ae2
=
ae5
;
ae5
=
t
;
}
if
(
ae2
>
ae3
)
{
long
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae4
>
ae5
)
{
long
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
a
[
e1
]
=
ae1
;
a
[
e3
]
=
ae3
;
a
[
e5
]
=
ae5
;
/*
* Use the second and fourth of the five sorted elements as pivots.
...
...
@@ -397,8 +413,8 @@ final class DualPivotQuicksort {
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
*/
long
pivot1
=
a
[
e2
]
;
a
[
e2
]
=
a
[
left
];
long
pivot2
=
a
[
e4
]
;
a
[
e4
]
=
a
[
right
];
long
pivot1
=
a
e2
;
a
[
e2
]
=
a
[
left
];
long
pivot2
=
a
e4
;
a
[
e4
]
=
a
[
right
];
/*
* Partitioning
...
...
@@ -427,21 +443,25 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
long
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
if
(
ak
>
pivot2
)
{
while
(
a
[
great
]
>
pivot2
&&
k
<
great
)
{
great
--;
while
(
a
[
great
]
>
pivot2
)
{
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -469,24 +489,28 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
long
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
continue
;
continue
;
}
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
else
{
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
{
// a[k] > pivot
while
(
a
[
great
]
>
pivot1
)
{
great
--;
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -518,19 +542,19 @@ final class DualPivotQuicksort {
while
(
a
[
less
]
==
pivot1
)
{
less
++;
}
for
(
int
k
=
less
+
1
;
k
<=
great
;
k
++)
{
if
(
a
[
k
]
==
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
}
while
(
a
[
great
]
==
pivot2
)
{
great
--;
}
for
(
int
k
=
great
-
1
;
k
>=
less
;
k
--)
{
if
(
a
[
k
]
==
pivot2
)
{
for
(
int
k
=
less
+
1
;
k
<=
great
;
)
{
long
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
a
[
k
++]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
else
if
(
ak
==
pivot2
)
{
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
pivot2
;
}
else
{
k
++;
}
}
}
...
...
@@ -585,7 +609,6 @@ final class DualPivotQuicksort {
for
(
int
k
=
left
+
1
;
k
<=
right
;
k
++)
{
short
ak
=
a
[
k
];
int
j
;
for
(
j
=
k
-
1
;
j
>=
left
&&
ak
<
a
[
j
];
j
--)
{
a
[
j
+
1
]
=
a
[
j
];
}
...
...
@@ -627,16 +650,20 @@ final class DualPivotQuicksort {
int
e4
=
e3
+
sixth
;
int
e2
=
e3
-
sixth
;
// Sort these elements in place using a 5-element sorting network
if
(
a
[
e1
]
>
a
[
e2
])
{
short
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e2
];
a
[
e2
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
short
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e3
])
{
short
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
short
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e4
])
{
short
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e3
]
>
a
[
e4
])
{
short
t
=
a
[
e3
];
a
[
e3
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e5
])
{
short
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
short
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
short
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
// Sort these elements using a 5-element sorting network
short
ae1
=
a
[
e1
],
ae2
=
a
[
e2
],
ae3
=
a
[
e3
],
ae4
=
a
[
e4
],
ae5
=
a
[
e5
];
if
(
ae1
>
ae2
)
{
short
t
=
ae1
;
ae1
=
ae2
;
ae2
=
t
;
}
if
(
ae4
>
ae5
)
{
short
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
if
(
ae1
>
ae3
)
{
short
t
=
ae1
;
ae1
=
ae3
;
ae3
=
t
;
}
if
(
ae2
>
ae3
)
{
short
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae1
>
ae4
)
{
short
t
=
ae1
;
ae1
=
ae4
;
ae4
=
t
;
}
if
(
ae3
>
ae4
)
{
short
t
=
ae3
;
ae3
=
ae4
;
ae4
=
t
;
}
if
(
ae2
>
ae5
)
{
short
t
=
ae2
;
ae2
=
ae5
;
ae5
=
t
;
}
if
(
ae2
>
ae3
)
{
short
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae4
>
ae5
)
{
short
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
a
[
e1
]
=
ae1
;
a
[
e3
]
=
ae3
;
a
[
e5
]
=
ae5
;
/*
* Use the second and fourth of the five sorted elements as pivots.
...
...
@@ -649,8 +676,8 @@ final class DualPivotQuicksort {
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
*/
short
pivot1
=
a
[
e2
]
;
a
[
e2
]
=
a
[
left
];
short
pivot2
=
a
[
e4
]
;
a
[
e4
]
=
a
[
right
];
short
pivot1
=
a
e2
;
a
[
e2
]
=
a
[
left
];
short
pivot2
=
a
e4
;
a
[
e4
]
=
a
[
right
];
/*
* Partitioning
...
...
@@ -679,21 +706,25 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
short
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
if
(
ak
>
pivot2
)
{
while
(
a
[
great
]
>
pivot2
&&
k
<
great
)
{
great
--;
while
(
a
[
great
]
>
pivot2
)
{
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -721,24 +752,28 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
short
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
continue
;
continue
;
}
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
else
{
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
{
// a[k] > pivot
while
(
a
[
great
]
>
pivot1
)
{
great
--;
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -770,19 +805,19 @@ final class DualPivotQuicksort {
while
(
a
[
less
]
==
pivot1
)
{
less
++;
}
for
(
int
k
=
less
+
1
;
k
<=
great
;
k
++)
{
if
(
a
[
k
]
==
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
}
while
(
a
[
great
]
==
pivot2
)
{
great
--;
}
for
(
int
k
=
great
-
1
;
k
>=
less
;
k
--)
{
if
(
a
[
k
]
==
pivot2
)
{
for
(
int
k
=
less
+
1
;
k
<=
great
;
)
{
short
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
a
[
k
++]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
else
if
(
ak
==
pivot2
)
{
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
pivot2
;
}
else
{
k
++;
}
}
}
...
...
@@ -837,7 +872,6 @@ final class DualPivotQuicksort {
for
(
int
k
=
left
+
1
;
k
<=
right
;
k
++)
{
char
ak
=
a
[
k
];
int
j
;
for
(
j
=
k
-
1
;
j
>=
left
&&
ak
<
a
[
j
];
j
--)
{
a
[
j
+
1
]
=
a
[
j
];
}
...
...
@@ -877,16 +911,20 @@ final class DualPivotQuicksort {
int
e4
=
e3
+
sixth
;
int
e2
=
e3
-
sixth
;
// Sort these elements in place using a 5-element sorting network
if
(
a
[
e1
]
>
a
[
e2
])
{
char
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e2
];
a
[
e2
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
char
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e3
])
{
char
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
char
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e4
])
{
char
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e3
]
>
a
[
e4
])
{
char
t
=
a
[
e3
];
a
[
e3
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e5
])
{
char
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
char
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
char
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
// Sort these elements using a 5-element sorting network
char
ae1
=
a
[
e1
],
ae2
=
a
[
e2
],
ae3
=
a
[
e3
],
ae4
=
a
[
e4
],
ae5
=
a
[
e5
];
if
(
ae1
>
ae2
)
{
char
t
=
ae1
;
ae1
=
ae2
;
ae2
=
t
;
}
if
(
ae4
>
ae5
)
{
char
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
if
(
ae1
>
ae3
)
{
char
t
=
ae1
;
ae1
=
ae3
;
ae3
=
t
;
}
if
(
ae2
>
ae3
)
{
char
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae1
>
ae4
)
{
char
t
=
ae1
;
ae1
=
ae4
;
ae4
=
t
;
}
if
(
ae3
>
ae4
)
{
char
t
=
ae3
;
ae3
=
ae4
;
ae4
=
t
;
}
if
(
ae2
>
ae5
)
{
char
t
=
ae2
;
ae2
=
ae5
;
ae5
=
t
;
}
if
(
ae2
>
ae3
)
{
char
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae4
>
ae5
)
{
char
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
a
[
e1
]
=
ae1
;
a
[
e3
]
=
ae3
;
a
[
e5
]
=
ae5
;
/*
* Use the second and fourth of the five sorted elements as pivots.
...
...
@@ -899,8 +937,8 @@ final class DualPivotQuicksort {
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
*/
char
pivot1
=
a
[
e2
]
;
a
[
e2
]
=
a
[
left
];
char
pivot2
=
a
[
e4
]
;
a
[
e4
]
=
a
[
right
];
char
pivot1
=
a
e2
;
a
[
e2
]
=
a
[
left
];
char
pivot2
=
a
e4
;
a
[
e4
]
=
a
[
right
];
/*
* Partitioning
...
...
@@ -929,21 +967,25 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
char
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
if
(
ak
>
pivot2
)
{
while
(
a
[
great
]
>
pivot2
&&
k
<
great
)
{
great
--;
while
(
a
[
great
]
>
pivot2
)
{
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -971,24 +1013,28 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
char
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
continue
;
continue
;
}
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
else
{
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
{
// a[k] > pivot
while
(
a
[
great
]
>
pivot1
)
{
great
--;
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -1020,19 +1066,19 @@ final class DualPivotQuicksort {
while
(
a
[
less
]
==
pivot1
)
{
less
++;
}
for
(
int
k
=
less
+
1
;
k
<=
great
;
k
++)
{
if
(
a
[
k
]
==
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
}
while
(
a
[
great
]
==
pivot2
)
{
great
--;
}
for
(
int
k
=
great
-
1
;
k
>=
less
;
k
--)
{
if
(
a
[
k
]
==
pivot2
)
{
for
(
int
k
=
less
+
1
;
k
<=
great
;
)
{
char
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
a
[
k
++]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
else
if
(
ak
==
pivot2
)
{
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
pivot2
;
}
else
{
k
++;
}
}
}
...
...
@@ -1087,7 +1133,6 @@ final class DualPivotQuicksort {
for
(
int
k
=
left
+
1
;
k
<=
right
;
k
++)
{
byte
ak
=
a
[
k
];
int
j
;
for
(
j
=
k
-
1
;
j
>=
left
&&
ak
<
a
[
j
];
j
--)
{
a
[
j
+
1
]
=
a
[
j
];
}
...
...
@@ -1129,16 +1174,20 @@ final class DualPivotQuicksort {
int
e4
=
e3
+
sixth
;
int
e2
=
e3
-
sixth
;
// Sort these elements in place using a 5-element sorting network
if
(
a
[
e1
]
>
a
[
e2
])
{
byte
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e2
];
a
[
e2
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
byte
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e3
])
{
byte
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
byte
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e4
])
{
byte
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e3
]
>
a
[
e4
])
{
byte
t
=
a
[
e3
];
a
[
e3
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e5
])
{
byte
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
byte
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
byte
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
// Sort these elements using a 5-element sorting network
byte
ae1
=
a
[
e1
],
ae2
=
a
[
e2
],
ae3
=
a
[
e3
],
ae4
=
a
[
e4
],
ae5
=
a
[
e5
];
if
(
ae1
>
ae2
)
{
byte
t
=
ae1
;
ae1
=
ae2
;
ae2
=
t
;
}
if
(
ae4
>
ae5
)
{
byte
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
if
(
ae1
>
ae3
)
{
byte
t
=
ae1
;
ae1
=
ae3
;
ae3
=
t
;
}
if
(
ae2
>
ae3
)
{
byte
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae1
>
ae4
)
{
byte
t
=
ae1
;
ae1
=
ae4
;
ae4
=
t
;
}
if
(
ae3
>
ae4
)
{
byte
t
=
ae3
;
ae3
=
ae4
;
ae4
=
t
;
}
if
(
ae2
>
ae5
)
{
byte
t
=
ae2
;
ae2
=
ae5
;
ae5
=
t
;
}
if
(
ae2
>
ae3
)
{
byte
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae4
>
ae5
)
{
byte
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
a
[
e1
]
=
ae1
;
a
[
e3
]
=
ae3
;
a
[
e5
]
=
ae5
;
/*
* Use the second and fourth of the five sorted elements as pivots.
...
...
@@ -1151,8 +1200,8 @@ final class DualPivotQuicksort {
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
*/
byte
pivot1
=
a
[
e2
]
;
a
[
e2
]
=
a
[
left
];
byte
pivot2
=
a
[
e4
]
;
a
[
e4
]
=
a
[
right
];
byte
pivot1
=
a
e2
;
a
[
e2
]
=
a
[
left
];
byte
pivot2
=
a
e4
;
a
[
e4
]
=
a
[
right
];
/*
* Partitioning
...
...
@@ -1181,21 +1230,25 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
byte
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
if
(
ak
>
pivot2
)
{
while
(
a
[
great
]
>
pivot2
&&
k
<
great
)
{
great
--;
while
(
a
[
great
]
>
pivot2
)
{
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -1223,24 +1276,28 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
byte
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
continue
;
continue
;
}
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
else
{
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
{
// a[k] > pivot
while
(
a
[
great
]
>
pivot1
)
{
great
--;
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -1272,19 +1329,19 @@ final class DualPivotQuicksort {
while
(
a
[
less
]
==
pivot1
)
{
less
++;
}
for
(
int
k
=
less
+
1
;
k
<=
great
;
k
++)
{
if
(
a
[
k
]
==
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
}
while
(
a
[
great
]
==
pivot2
)
{
great
--;
}
for
(
int
k
=
great
-
1
;
k
>=
less
;
k
--)
{
if
(
a
[
k
]
==
pivot2
)
{
for
(
int
k
=
less
+
1
;
k
<=
great
;
)
{
byte
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
a
[
k
++]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
else
if
(
ak
==
pivot2
)
{
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
pivot2
;
}
else
{
k
++;
}
}
}
...
...
@@ -1356,7 +1413,6 @@ final class DualPivotQuicksort {
for
(
int
k
=
left
;
k
<=
n
;
k
++)
{
float
ak
=
a
[
k
];
if
(
ak
==
0.0f
&&
NEGATIVE_ZERO
==
Float
.
floatToIntBits
(
ak
))
{
a
[
k
]
=
0.0f
;
numNegativeZeros
++;
...
...
@@ -1432,7 +1488,6 @@ final class DualPivotQuicksort {
for
(
int
k
=
left
+
1
;
k
<=
right
;
k
++)
{
float
ak
=
a
[
k
];
int
j
;
for
(
j
=
k
-
1
;
j
>=
left
&&
ak
<
a
[
j
];
j
--)
{
a
[
j
+
1
]
=
a
[
j
];
}
...
...
@@ -1460,16 +1515,20 @@ final class DualPivotQuicksort {
int
e4
=
e3
+
sixth
;
int
e2
=
e3
-
sixth
;
// Sort these elements in place using a 5-element sorting network
if
(
a
[
e1
]
>
a
[
e2
])
{
float
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e2
];
a
[
e2
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
float
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e3
])
{
float
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
float
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e4
])
{
float
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e3
]
>
a
[
e4
])
{
float
t
=
a
[
e3
];
a
[
e3
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e5
])
{
float
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
float
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
float
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
// Sort these elements using a 5-element sorting network
float
ae1
=
a
[
e1
],
ae2
=
a
[
e2
],
ae3
=
a
[
e3
],
ae4
=
a
[
e4
],
ae5
=
a
[
e5
];
if
(
ae1
>
ae2
)
{
float
t
=
ae1
;
ae1
=
ae2
;
ae2
=
t
;
}
if
(
ae4
>
ae5
)
{
float
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
if
(
ae1
>
ae3
)
{
float
t
=
ae1
;
ae1
=
ae3
;
ae3
=
t
;
}
if
(
ae2
>
ae3
)
{
float
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae1
>
ae4
)
{
float
t
=
ae1
;
ae1
=
ae4
;
ae4
=
t
;
}
if
(
ae3
>
ae4
)
{
float
t
=
ae3
;
ae3
=
ae4
;
ae4
=
t
;
}
if
(
ae2
>
ae5
)
{
float
t
=
ae2
;
ae2
=
ae5
;
ae5
=
t
;
}
if
(
ae2
>
ae3
)
{
float
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae4
>
ae5
)
{
float
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
a
[
e1
]
=
ae1
;
a
[
e3
]
=
ae3
;
a
[
e5
]
=
ae5
;
/*
* Use the second and fourth of the five sorted elements as pivots.
...
...
@@ -1482,8 +1541,8 @@ final class DualPivotQuicksort {
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
*/
float
pivot1
=
a
[
e2
]
;
a
[
e2
]
=
a
[
left
];
float
pivot2
=
a
[
e4
]
;
a
[
e4
]
=
a
[
right
];
float
pivot1
=
a
e2
;
a
[
e2
]
=
a
[
left
];
float
pivot2
=
a
e4
;
a
[
e4
]
=
a
[
right
];
/*
* Partitioning
...
...
@@ -1512,21 +1571,25 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
float
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
if
(
ak
>
pivot2
)
{
while
(
a
[
great
]
>
pivot2
&&
k
<
great
)
{
great
--;
while
(
a
[
great
]
>
pivot2
)
{
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -1554,24 +1617,28 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
float
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
continue
;
continue
;
}
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
else
{
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
{
// a[k] > pivot
while
(
a
[
great
]
>
pivot1
)
{
great
--;
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -1603,19 +1670,19 @@ final class DualPivotQuicksort {
while
(
a
[
less
]
==
pivot1
)
{
less
++;
}
for
(
int
k
=
less
+
1
;
k
<=
great
;
k
++)
{
if
(
a
[
k
]
==
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
}
while
(
a
[
great
]
==
pivot2
)
{
great
--;
}
for
(
int
k
=
great
-
1
;
k
>=
less
;
k
--)
{
if
(
a
[
k
]
==
pivot2
)
{
for
(
int
k
=
less
+
1
;
k
<=
great
;
)
{
float
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
a
[
k
++]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
else
if
(
ak
==
pivot2
)
{
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
pivot2
;
}
else
{
k
++;
}
}
}
...
...
@@ -1687,7 +1754,6 @@ final class DualPivotQuicksort {
for
(
int
k
=
left
;
k
<=
n
;
k
++)
{
double
ak
=
a
[
k
];
if
(
ak
==
0.0d
&&
NEGATIVE_ZERO
==
Double
.
doubleToLongBits
(
ak
))
{
a
[
k
]
=
0.0d
;
numNegativeZeros
++;
...
...
@@ -1763,7 +1829,6 @@ final class DualPivotQuicksort {
for
(
int
k
=
left
+
1
;
k
<=
right
;
k
++)
{
double
ak
=
a
[
k
];
int
j
;
for
(
j
=
k
-
1
;
j
>=
left
&&
ak
<
a
[
j
];
j
--)
{
a
[
j
+
1
]
=
a
[
j
];
}
...
...
@@ -1791,16 +1856,20 @@ final class DualPivotQuicksort {
int
e4
=
e3
+
sixth
;
int
e2
=
e3
-
sixth
;
// Sort these elements in place using a 5-element sorting network
if
(
a
[
e1
]
>
a
[
e2
])
{
double
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e2
];
a
[
e2
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
double
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e3
])
{
double
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
double
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e1
]
>
a
[
e4
])
{
double
t
=
a
[
e1
];
a
[
e1
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e3
]
>
a
[
e4
])
{
double
t
=
a
[
e3
];
a
[
e3
]
=
a
[
e4
];
a
[
e4
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e5
])
{
double
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
if
(
a
[
e2
]
>
a
[
e3
])
{
double
t
=
a
[
e2
];
a
[
e2
]
=
a
[
e3
];
a
[
e3
]
=
t
;
}
if
(
a
[
e4
]
>
a
[
e5
])
{
double
t
=
a
[
e4
];
a
[
e4
]
=
a
[
e5
];
a
[
e5
]
=
t
;
}
// Sort these elements using a 5-element sorting network
double
ae1
=
a
[
e1
],
ae2
=
a
[
e2
],
ae3
=
a
[
e3
],
ae4
=
a
[
e4
],
ae5
=
a
[
e5
];
if
(
ae1
>
ae2
)
{
double
t
=
ae1
;
ae1
=
ae2
;
ae2
=
t
;
}
if
(
ae4
>
ae5
)
{
double
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
if
(
ae1
>
ae3
)
{
double
t
=
ae1
;
ae1
=
ae3
;
ae3
=
t
;
}
if
(
ae2
>
ae3
)
{
double
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae1
>
ae4
)
{
double
t
=
ae1
;
ae1
=
ae4
;
ae4
=
t
;
}
if
(
ae3
>
ae4
)
{
double
t
=
ae3
;
ae3
=
ae4
;
ae4
=
t
;
}
if
(
ae2
>
ae5
)
{
double
t
=
ae2
;
ae2
=
ae5
;
ae5
=
t
;
}
if
(
ae2
>
ae3
)
{
double
t
=
ae2
;
ae2
=
ae3
;
ae3
=
t
;
}
if
(
ae4
>
ae5
)
{
double
t
=
ae4
;
ae4
=
ae5
;
ae5
=
t
;
}
a
[
e1
]
=
ae1
;
a
[
e3
]
=
ae3
;
a
[
e5
]
=
ae5
;
/*
* Use the second and fourth of the five sorted elements as pivots.
...
...
@@ -1813,8 +1882,8 @@ final class DualPivotQuicksort {
* the pivots are swapped back into their final positions, and
* excluded from subsequent sorting.
*/
double
pivot1
=
a
[
e2
]
;
a
[
e2
]
=
a
[
left
];
double
pivot2
=
a
[
e4
]
;
a
[
e4
]
=
a
[
right
];
double
pivot1
=
a
e2
;
a
[
e2
]
=
a
[
left
];
double
pivot2
=
a
e4
;
a
[
e4
]
=
a
[
right
];
/*
* Partitioning
...
...
@@ -1843,21 +1912,25 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
double
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
if
(
ak
>
pivot2
)
{
while
(
a
[
great
]
>
pivot2
&&
k
<
great
)
{
great
--;
while
(
a
[
great
]
>
pivot2
)
{
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -1885,24 +1958,28 @@ final class DualPivotQuicksort {
*
* Pointer k is the first index of ?-part
*/
outer:
for
(
int
k
=
less
;
k
<=
great
;
k
++)
{
double
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
continue
;
continue
;
}
if
(
ak
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
else
{
if
(
k
>
less
)
{
a
[
k
]
=
a
[
less
];
a
[
less
]
=
ak
;
}
less
++;
}
else
{
// a[k] > pivot
while
(
a
[
great
]
>
pivot1
)
{
great
--;
if
(
k
==
great
--)
{
break
outer
;
}
}
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
ak
;
ak
=
a
[
k
];
if
(
ak
<
pivot1
)
{
if
(
(
ak
=
a
[
k
])
<
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
ak
;
}
...
...
@@ -1934,19 +2011,19 @@ final class DualPivotQuicksort {
while
(
a
[
less
]
==
pivot1
)
{
less
++;
}
for
(
int
k
=
less
+
1
;
k
<=
great
;
k
++)
{
if
(
a
[
k
]
==
pivot1
)
{
a
[
k
]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
}
while
(
a
[
great
]
==
pivot2
)
{
great
--;
}
for
(
int
k
=
great
-
1
;
k
>=
less
;
k
--)
{
if
(
a
[
k
]
==
pivot2
)
{
for
(
int
k
=
less
+
1
;
k
<=
great
;
)
{
double
ak
=
a
[
k
];
if
(
ak
==
pivot1
)
{
a
[
k
++]
=
a
[
less
];
a
[
less
++]
=
pivot1
;
}
else
if
(
ak
==
pivot2
)
{
a
[
k
]
=
a
[
great
];
a
[
great
--]
=
pivot2
;
}
else
{
k
++;
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录