QuickSort(int i) { this.threshold = i; } publicint[] sort(int[]arr){ int len = arr.length; if(len==0) return arr; // 在新数组上进行排序而不影响原始数组 int[]A = newint[len]; System.arraycopy(arr, 0, A, 0, len); quickSort(A, 0, len-1); return A; } privatevoidquickSort(int[]A, int left, int right){ if(left>right) return; // 小数据情况下递归方法需要调用栈,效率较低,此时采用插入排序方法 if(right-left>4){ // 获取基准值 int pivot = partition(A, left, right); quickSort(A, left, pivot-1); quickSort(A, pivot+1, right); }else { insertionSort(A); } } privateintpartition(int[]A, int left, int right){ // 以末端的数字为基准 int criterion = getMedianPivot(A, left, right); // 从第二个及倒数第二个开始,因为getMedianPivot已经对首末数值进行了排序 int i = left+1; int j = right-1; while(i<j){ // 必须左边的哨兵先走,否则交换数值会出错 while(i<j && A[i]<=criterion){ i++; } while(i<j && A[j]>=criterion){ j--; } if(i<j){ int temp = A[i]; A[i] = A[j]; A[j] = temp; } } A[right-1] = A[i]; A[i] = criterion; return i; }
privateintgetMedianPivot(int[]A, int left, int right){ int center = (left+right)/2; // 对于首末及中间的数进行排序 if (A[left] > A[center]) { swap(A, left, center); } if (A[center] > A[right]) { swap(A, center, right); } if (A[left] < A[right]) { swap(A, left, right); } //交换中间与倒数第二个数,因为经过排序,最后一个已经是最大 swap(A, center, right-1); return A[right-1]; }
privatevoidswap(int[] A, int i, int j){ int temp = A[i]; A[i] = A[j]; A[j] = temp; }
privatevoidinsertionSort(int[] A){ int len = A.length; int i,j; for (i = 0; i < len; i++) { int temp = A[i]; for (j = i; j > 0 && A[j] < A[j - 1]; j--) { A[j] = A[j-1]; } A[j] = temp; } } }