快速排序(QuickSort)
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class ShellSort {
public static void main(String[] args) {
// int[] array = {0, -1, 78, 0, 23, -567, 70};
int n = 80000;
int[] array = new int[n];
for (int i = 0; i < array.length; i++) {
array[i] = (int) Math.random() * 800000;
}
Date before = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String beforeStr = sdf.format(before);
System.out.println("排序前:" + beforeStr);
doQuickSorting(array, 0, array.length-1);
Date after = new Date();
String afterStr = sdf.format(after);
System.out.println("排序後:" + afterStr);
}
/**
* 快速排序
* 花費時間秒 => 陣列長度80000
* @param array
*/
public static void doQuickSorting(int[] array, int left, int right) {
int l = left;
int r = right;
int middle = (left + right) / 2;
int temp = 0;
// 使array[middle]左邊的值都小於自己,右邊的值都大於自己
while (l < r) {
while (array[l] < array[middle]) {
l += 1;
}
while (array[r] > array[middle]) {
r -= 1;
}
if (l >= r) {
break;
}
// 交換
temp = array[l];
array[l] = array[r];
array[r] = temp;
// 若陣列中array[middle]左邊的值等於自己,代表左邊的值已經全部小於中間的值
// 就移動另一邊的索引再與中間的值比較
if (array[l] == array[middle]) {
r -= 1;
}
// 若陣列中array[middle]右邊的值等於自己,代表右邊的值已經全部大於中間的值
// 就移動另一邊的索引再與中間的值比較
if (array[r] == array[middle]) {
l += 1;
}
}
// 上面循環完畢,代表左邊的值已經全部小於中間的值;右邊的值已經全部大於中間的值
if (l == r) {
l++;
r--;
}
// 向右遞歸(使右邊的值有序)
if (l < right) {
doQuickSorting(array, l, right);
}
// 向左遞歸(使左邊的值有序)
if (r > left) {
doQuickSorting(array, left, r);
}
}
}
如有敘述錯誤,還請不吝嗇留言指教,thanks!