快速排序:Java實現(必須掌握的兩種實現方式)
阿新 • • 發佈:2019-02-16
第一種實現方式採用《演算法導論》(原書第3版)中的快速排序演算法,且參考了《劍指Offer》(第2版)中遞迴實現快速排序的程式碼,如下:
public void quickSort_1(int[] data, int start, int end) { if (data == null || start < 0 || end > data.length - 1) { throw new IllegalArgumentException("Invalid Parameters"); } if (start == end) return; int index = partition(data, start, end); if (index > start) { quickSort_1(data, start, index - 1); } if (index < end) { quickSort_1(data, index + 1, end); } } private int partition(int[] data, int start, int end) { int index = start + (int)(Math.random() * (end - start + 1)); swap(data, index, end); int small = start - 1; for (index = start; index < end; index++) { if (data[index] < data[end]) { small++; if (small != index) { swap(data, index, small); } } } swap(data, small + 1, end); return small + 1; } private void swap(int[] data, int i, int j){ int temp = data[i]; data[i] = data[j]; data[j] = temp; }
第二種實現方式是快排經典的“挖坑填數+分治”,如下:
public void quickSort_2(int[] data, int start, int end) { if (data == null || start >= end) return; int i = start, j = end; int pivotKey = data[start]; while (i < j) { while (i < j && data[j] >= pivotKey) j--; if (i < j) data[i++] = data[j]; while (i < j && data[i] <= pivotKey) i++; if (i < j) data[j--] = data[i]; } data[i] = pivotKey; quickSort_2(data, start, i - 1); quickSort_2(data, i + 1, end); }