就地分拣 - 这是当你来自外部,给你,而不是创造一些新的阵列和以任何方式使用它们原来的阵列,上运行。就地分拣花费O(1)的空间,而不是为O(n)+使用时附加的数据structres
实施例的就地排序:
public static void simpleBubbleSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 1; j < arr.length; j++) {
if (arr[j - 1] > arr[j]) {
swap(arr, j - 1, j);
}
}
}
}
与之相对排序合并沿着方式创建阵列,并且最后将它们组合起来并返回NOT而不是原来的(给予我们的)数组,而是包含结果的数组。
public static int[] mergeSort(int[] arr) {
if (arr.length < 2) return arr;
int mid = arr.length/2;
int[] left = new int[mid];
int[] right = new int[mid + arr.length % 2];
int j = 0;
for (int i = 0; i < arr.length; i++) {
if (i < mid) {
left[i] = arr[i];
} else {
right[j++] = arr[i];
}
}
// keeps going until there's 1 element in each array[]
return mergeReturn(mergeSort(left), mergeSort(right));
}
private static int[] mergeReturn(int[] leftArr, int[] rightArr) {
int leftPointer = 0, rightPointer = 0, combinedSize = leftArr.length + rightArr.length;
int[] merged = new int[combinedSize];
for (int i = 0; i < combinedSize; i++) {
if (leftPointer < leftArr.length && rightPointer < rightArr.length) {
if (leftArr[leftPointer] < rightArr[rightPointer]) {
merged[i] = leftArr[leftPointer++];
} else {
merged[i] = rightArr[rightPointer++];
}
} else if (leftPointer < leftArr.length) { // adding the last element
merged[i] = leftArr[leftPointer++];
} else {
merged[i] = rightArr[rightPointer++];
}
}
return merged;
}
的可能的复制[就地快速排序中的Java(http://stackoverflow.com/questions/29609909/inplace-quicksort-in-java) –