[JAVA]快速排序(QuickSort):小到大

快速排序(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!