62,623
社区成员
发帖
与我相关
我的任务
分享public class Quick {
static Random random = new Random();
public static void main(String[] args) {
Quick quick = new Quick();
int[] array = new int[100000000];
int r = array.length << 1;
for (int i = 0; i < array.length; i++) {
array[i] = random.nextInt(r);
}
int[] array_new = array.clone();
long start = System.currentTimeMillis();
quick.quickSort(array, 0, array.length - 1);
System.out.println("quickSort: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
quick.quickSortNode(array_new);
System.out.println("quickSortNode: " + (System.currentTimeMillis() - start));
}
public void quickSort(int[] arr, int start, int end) {
int i = start;
int j = end;
int key = arr[i];
boolean bl = true;
while (i < j) {
if (bl) {
if (key > arr[j]) {
arr[i++] = arr[j];
bl = !bl;
} else j--;
} else {
if (key < arr[i]) {
arr[j--] = arr[i];
bl = !bl;
} else i++;
}
}
arr[i] = key;
if (start < i - 1) quickSort(arr, start, i - 1);
if (i + 1 < end) quickSort(arr, i + 1, end);
}
// 改版快速排序, 将递归改为循环
public void quickSortNode(int[] arr) {
int len = arr.length, p = 0;
int[][] r = new int[arr.length > 100 ? 100 : arr.length][];
r[p++] = new int[]{0, len - 1};
do {
int[] point = r[--p];
if (point[0] >= point[1]) continue;
int key = arr[point[0]], i = point[0], j = point[1], left = i, right = j;
boolean bl = true;
while (i < j) {
if (bl) {
if (key > arr[j]) {
arr[i++] = arr[j];
bl = !bl;
} else j--;
} else {
if (key < arr[i]) {
arr[j--] = arr[i];
bl = !bl;
} else i++;
}
}
arr[i] = key;
if (left < i - 1) r[p++] = new int[]{left, i - 1};
if (i + 1 < right) r[p++] = new int[]{i + 1, right};
} while (p > 0);
}
}
这是测试1亿数据用时. 递归略快.
quickSort: 10416
quickSortNode: 11876