package
algrithms.sort;
public
class
QuickSort {
public
void
quickSort3Way(Comparable[] arr,
int
n) {
quickSort3Way(arr,
0
, n-
1
);
}
/**
* 三路快排
* @param arr 数组
* @param l 左边界
* @param r 右边界
*/
private
void
quickSort3Way(Comparable[] arr,
int
l,
int
r) {
swap(arr, l, (
int
) (Math.random()*(r-l+
1
)) + l);
Comparable v = arr[l];
int
lt = l;
int
gt = r +
1
;
int
i = l+
1
;
while
(i < gt) {
if
(arr[i].compareTo(v) <
0
) {
swap(arr, i, lt+
1
);
lt++;
i++;
}
else
if
(arr[i].compareTo(v) >
0
) {
swap(arr, i, gt -
1
);
gt--;
}
else
{
i++;
}
}
swap(arr, l, lt);
quickSort3Way(arr, l, lt-
1
);
quickSort3Way(arr, gt, r);
}
private
static
void
swap(Object[] arr,
int
i,
int
j) {
Object t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
public
static
void
main(String[] args) {
QuickSort quickSort =
new
QuickSort();
int
N =
1000000
;
Integer[] arr = SortTestHelper.generateRandomArray(N,
0
,
100
);
Integer[] arr1 = SortTestHelper.generateNearlyOrderArray(N,
100
);
long
startTime = System.currentTimeMillis();
quickSort.quickSort3Way(arr1, N);
long
endTime = System.currentTimeMillis();
System.out.println(
"用时"
+ (endTime-startTime)/
1000.00
+
"s"
);
return
;
}
}