高速排序是一种分治排序算法。广泛觉得它是解决一般问题的最佳排序算法。同插入排序一样。高速排序也属于比較排序的一种,并且不须要额外的存储空间。在处理中到大型数据集时。高速排序是一个比較好的选择。
因为高速排序是一种分治算法。因此能够用分治法的思想将排序分为三个步骤
1.分:设定一个切割值将数据分为两部分。
2.治:分别在两部分用递归的方式继续使用高速排序法。
3.合:对切割部分排序排序直至完毕。
实现代码例如以下:
import java.util.Random;
/**
* 高速排序 {分,治,合}
* @author kevin LUAN
*
*/
public class QuickSort {
public static void main(String[] args) {
int total = 5;
QuickSort quickSort = new QuickSort();
while (total > 0) {
Integer arr[] = randomArray(1000000);
long start = System.currentTimeMillis();
quickSort.sort(arr);
System.out.println("use time:" + (System.currentTimeMillis() - start));
quickSort.check(arr);
total--;
}
}
public void sort(Integer[] arr) {
mergeSort(arr, 0, arr.length - 1);
}
private void mergeSort(Integer arr[], int low, int high) {
int a = low;
int b = high;
int middle;
middle = getMiddle(arr, low, high);
while (low < high) {
while (high > low) {
/* 抵位小于中间值 */
if (arr[low] <= middle) {
low++;
} else {
// TODO 须要进入高位寻找交换值
break;
}
}
while (high > low) {
if (arr[high] > middle) {
high--;
} else {
swap(arr, low, high);
break;
}
}
}
/* 选择的切割值靠近边界 */
if (b == high || a == low) {
sort(arr, a, b + 1);
return;
}
/**
* 递归【分,治,合】
*/
if (low - a > 0) {
mergeSort(arr, a, low);
}
if (b - high > 0) {
mergeSort(arr, high, b);
}
}
private void sort(Integer[] arr, int low, int high) {
for (int i = low; i < high; i++)
for (int j = i; j > low && ((Comparable) arr[j - 1]).compareTo(arr[j]) > 0; j--)
swap(arr, j, j - 1);
}
private void swap(Integer arr[], int a, int b) {
Integer av = arr[a];
arr[a] = arr[b];
arr[b] = av;
}
/**
* 获取中间值
* <p>
* 高速排序算法是否高效主要取决于该值
* </p>
*
* @param arr
* @param startIndex
* @param endIndex
* @return
*/
private int getMiddle(Integer arr[], int startIndex, int endIndex) {
Random random = new Random();
int max = endIndex - startIndex + 1;
int n1 = arr[random.nextInt(max) + startIndex];
int n2 = arr[random.nextInt(max) + startIndex];
int n3 = arr[random.nextInt(max) + startIndex];
if (n1 > n2 && n1 > n3) {
return getMaxVal(n2, n3);
} else if (n2 > n1 && n2 > n3) {
return getMaxVal(n1, n3);
} else if (n3 > n2 && n3 > n1) {
return getMaxVal(n1, n2);
} else {
if (n1 == n2) {
return n3;
} else if (n2 == n3) {
return n1;
} else {
/* (n1 == n3) */
return n2;
}
}
}
private int getMaxVal(int n2, int n3) {
if (n2 > n3) {
return n2;
} else {
return n3;
}
}
/**
* 随机生成測试数值
* <p>
* 使用分治合算法数据越分散性能越高,越密集效率越低
* </p>
*
* @param total
* @return
*/
public static Integer[] randomArray(int total) {
Random random = new Random();
Integer[] arrays = new Integer[total];
for (int i = 0; i < total; i++) {
if (i % 5 == 0) {
arrays[i] = -random.nextInt(10000);
} else {
arrays[i] = random.nextInt(10000);
}
}
return arrays;
}
/**
* 检測排序后的结果是否正确
*
* @param array
*/
public void check(Integer array[]) {
for (int i = 0; i < array.length - 1; i++) {
if (array[i] > array[i + 1]) {
throw new RuntimeException("出错了:" + array[i] + "==" + array[i + 1]);
}
}
}
}
use time:249
use time:205
use time:245
use time:220
use time:203